概念
適配器模式:將一個(gè)類的接口轉(zhuǎn)換為用戶希望的另一個(gè)接口, Adapter模式是的原本由于接口不兼容而不能一起工作的那些類可以一起工作。
這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式。
UML圖
<img src="doc/adapterpattern.jpg"/>

adapterpattern.jpg
具體實(shí)現(xiàn):
簡(jiǎn)單來(lái)說(shuō)是: 定一個(gè)一個(gè)目標(biāo)接口, 一個(gè)需要被適配的接口, 適配器結(jié)構(gòu)體實(shí)現(xiàn)這個(gè)目標(biāo)接口, 并包含被適配接口。 被適配結(jié)構(gòu)體實(shí)現(xiàn)被適配接口, 將結(jié)構(gòu)體實(shí)例傳遞給適配器, 讓適配器可以通過(guò)實(shí)現(xiàn)的目標(biāo)接口方法來(lái)調(diào)用。 用戶直接使用適配器調(diào)用目標(biāo)接口調(diào)用到被適配的接口。
- 定義一個(gè)一個(gè)目標(biāo)接口, 目標(biāo)接口包含需要的方法接口。
- 定義一個(gè)需要被適配的結(jié)構(gòu)體的接口, 這個(gè)接口方法是需要具體調(diào)用的方法。
- 定義一個(gè)適配器結(jié)構(gòu)體, 適配器結(jié)構(gòu)體包含被適配的結(jié)構(gòu)體的接口, 實(shí)現(xiàn)了目標(biāo)接口, 目標(biāo)接口調(diào)用被適配接口的方法, 同時(shí)定義一個(gè)實(shí)例化方法, 參數(shù)是被適配結(jié)構(gòu)體接口, 將接口返回出去。
- 定義一個(gè)實(shí)現(xiàn)了需要被適配的接口的結(jié)構(gòu)體, 將結(jié)構(gòu)體實(shí)例傳遞給 適配器。
適配器模式的場(chǎng)景和優(yōu)缺點(diǎn)
使用場(chǎng)景
希望使用一個(gè)已經(jīng)存在的接口, 但是他的具體方法和要求不相同的時(shí)候。這個(gè)時(shí)候可以加一個(gè)適配器。將適配器適配到現(xiàn)存的接口當(dāng)中。
比如在需要對(duì)早期的代碼復(fù)用一些功能的時(shí)候有價(jià)值。
優(yōu)點(diǎn)
- 可以讓任何兩個(gè)沒(méi)有關(guān)聯(lián)的類一起運(yùn)行
- 提高了類的復(fù)用
- 增加了類的透明度
- 靈活性好
缺點(diǎn)
- 過(guò)多地使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握
代碼實(shí)現(xiàn)
package main
import (
"fmt"
)
// 用戶希望使用的目標(biāo)接口
type Target interface {
Request() string
}
// ***********適配器,是將轉(zhuǎn)換Adaptee為Target接口的適配器, 實(shí)現(xiàn)了Target接口***********
type adapter struct {
Adaptee
}
// NewAdapter 是Adapter的工廠函數(shù)
func NewAdapter(adaptee Adaptee) Target {
return &adapter{
Adaptee: adaptee,
}
}
// Request 實(shí)現(xiàn)Target接口
func (a *adapter) Request() string {
//調(diào)用的是目標(biāo)的方法(轉(zhuǎn)換成客戶希望的另外一個(gè)接口)
return a.SpecificRequest()
}
// ************************************
// ********需要適配結(jié)構(gòu)體的目標(biāo)接口*********
type Adaptee interface {
SpecificRequest() string
}
// ************************************
// ********adapteeImpl需要適配的結(jié)構(gòu)體, 實(shí)現(xiàn)了需要適配的目標(biāo)接口 Adaptee************
type adapteeImpl struct{}
// NewAdaptee 是被適配接口的工廠函數(shù)
func NewAdaptee() Adaptee {
return &adapteeImpl{}
}
// SpecificRequest 是目標(biāo)類的一個(gè)方法
func (*adapteeImpl) SpecificRequest() string {
return "adaptee method"
}
// ************************************
func main() {
adaptee := NewAdaptee()
target := NewAdapter(adaptee)
res := target.Request()
fmt.Printf("res:%s\n", res)
}