目录

结构型:适配器模式

释义

适配器模式,实现接口兼容。为对象增加一个适配器,使得其兼容原先无法使用的内容。

/%E7%BB%93%E6%9E%84%E5%9E%8B%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F/%E7%BB%93%E6%9E%84%E5%9E%8B%EF%BC%9A%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F.resources/3CBD8E02-7D82-4293-8DD6-3CF659150126.png
适配器模式
BasicReader只能读txt格式的文件,AdvancedReader能够读ppt格式和doc格式的文件。为了让BasicReader也能读ppt和doc,我们为其引入适配器ReaderAdapter,适配器中使用了AdvancedReader,因此BasicReader获得了读ppt和doc的能力,实现了对这两种格式的兼容。

被兼容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface AdvancedReader {
    fun readPpt()
    fun readDoc()
}

class Ppt() {
    override fun readPpt() {
        toReadPpt()
    }
    
    override fun readDoc() {
        // do Nothing
    }
}

class Doc() { 
    override fun readPpt() {
        // do Nothing
    }
    
    override fun readDoc() {
        toReadDoc()
    }
}

适配器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class ReaderAdapter(
    val advancedReader: AdvancedReader
) {
    fun compatOpen(type: String) {
        when(type) {
            "ppt" -> advancedReader.readPpt()
            "doc" -> advanceReader.readDoc()
        }
    }
}

兼容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface BasicReader {
    fun readTxt()
}

class Txt(readerAdapter: ReaderAdapter) : BasicReader {
    
    override fun readTxt() {
        toReadTxt()
    }
    
    fun compatRead(type: String) {
        when(type) {
            // 如果是txt就调用自身的方法
            "txt" -> readTxt()
            // 如果是ppt和doc就通过适配器调用advancedReader的方法
            "doc" -> readerAdapter
                .advancedReader
                .compatOpen(type)
            "ppt" -> readerAdapter
                .advancedReader
                .compatOpen(type)
        }
    }
}

使用

1
2
3
4
5
6
7
8
9
fun main() {

    doc: Doc = Doc()
    readerAdapter: ReaderAdapter = ReaderAdapter(doc)
    txt: Txt = Txt(readerAdapter)
    
    // txt兼容打开doc
    txt.compatOpen("doc")
}