1. 程式人生 > 實用技巧 >Go!Go!Go!設計模式-適配設計模式

Go!Go!Go!設計模式-適配設計模式

零:前言

參考:
https://github.com/senghoo/golang-design-pattern/tree/master/02_adapter
介面卡模式用於轉換一種介面適配另一種介面。
實際使用中Adaptee一般為介面,並且使用工廠函式生成例項。
在Adapter中匿名組合Adaptee介面,所以Adapter類也擁有SpecificRequest例項方法,又因為Go語言中非入侵式介面特徵,其實Adapter也適配Adaptee介面。


核心原理:
建立一個介面卡,用在獨立模組之間獨立開發的場景:
模組1要求一個功能實現介面A,但是對應的功能模組定義的介面卻是B,
此時就需要一個適配層:
對上,實現當前模組1的功能介面A,但並不負責實現所謂的"功能";
對下,呼叫真正功能模組2的功能介面B;
那麼如何兼顧對上和對下呢?答: 實現介面A,內嵌介面B


步驟:
1. 上,模組開發中,制定了某個功能的介面1,對於介面卡來說稱為適配的目標介面
2. 下,真正實現了某個功能的另一個模組制定介面2,對於介面卡來說稱為被適配的目標介面
3. 介面卡類, 實現適配的目標介面,介面內部呼叫被適配的目標例項的介面函式,

一:樣例

//1. Target 是適配的目標介面
type Target interface {
    Request() string
}

//2. Adaptee 是被適配的目標介面
type Adaptee interface {
    SpecificRequest() string
}
//AdapteeImpl 是被適配的目標結構體,實現對應的介面
type adapteeImpl struct{}
func (*adapteeImpl) SpecificRequest() string {
    return "adaptee method"
}
//AdapteeFactory 是被適配介面的工廠函式,用來生成一個被是被適配的目標類例項
func AdapteeFactory() Adaptee { return &adapteeImpl{} } //3. Adapter即為適配層,轉換Adaptee的介面為Target要求的介面的介面卡:對外實現目標介面,內部呼叫被適配類例項介面方法 type adapter struct { Adaptee //內嵌被適配目標介面,其隱含包括了一個同名的filed } func (a *adapter) Request() string { return a.SpecificRequest() //****適配的核心: 在目標介面中呼叫被適配介面*****
} //AdapterFactory 是Adapter的工廠函式: 給我一個向下的被適配類例項,我給你一個能夠向上相容的介面卡 func AdapterFactory(adaptee Adaptee) Target { return &adapter{ Adaptee: adaptee, //將底層被呼叫類例項作為自己的一個field } }

adaptee := AdapteeFactory()
target := AdapterFactory(adaptee)
res := target.Request()