什么是適配器模式?
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。使原本由于接口不兼容而不能一起工作的那些類可以一起工作。
實(shí)現(xiàn)
// Target目標(biāo)角色,該角色定義把其他類轉(zhuǎn)換為何種接口,也就是期望接口,通常情況下是一個(gè)接口或一個(gè)抽象類,一般不會(huì)是實(shí)現(xiàn)類。
type Target interface {
Request()
}
// Adaptee源角色,想把誰(shuí)轉(zhuǎn)換為目標(biāo)角色,這個(gè)“誰(shuí)”就是源角色,它是已經(jīng)存在的、運(yùn)行良好的類或?qū)ο蟆?type Adaptee struct {
}
func (this *Adaptee)SpecificRequest() {
fmt.Println("特殊請(qǐng)求")
}
// Adapter適配器角色,是適配器模式的核心角色,它的職責(zé)是通過(guò)繼承或是類關(guān)聯(lián)的方式把源角色轉(zhuǎn)換為目標(biāo)角色。
type Adapter struct {
*Adaptee
}
func NewAdapter() *Adapter {
return &Adapter{}
}
func (this *Adapter)request() {
this.SpecificRequest()
}
// 目標(biāo)角色的實(shí)現(xiàn)類。
type ConcreteTarget struct {
}
func NewConcreteTarget() *ConcreteTarget {
return &ConcreteTarget{}
}
func (this *ConcreteTarget)request() {
fmt.Println("普通請(qǐng)求")
}
func TestNewAdapter(t *testing.T) {
target1 := NewConcreteTarget()
target1.request()
target2 := NewAdapter()
target2.request()
}
/*
=== RUN TestNewAdapter
普通請(qǐng)求
特殊請(qǐng)求
--- PASS: TestNewAdapter (0.00s)
PASS
*/
優(yōu)點(diǎn)
- 可以讓任何兩個(gè)沒(méi)有關(guān)聯(lián)的類一起運(yùn)行;
- 增加了類的透明性。我們?cè)L問(wèn)Target目標(biāo)角色,但具體實(shí)現(xiàn)都委托給了源角色,而這些對(duì)高層模塊是透明的,也是不需要關(guān)心的;
- 提高了類的復(fù)用度。源角色在原有的系統(tǒng)中還是可以正常使用,而在目標(biāo)角色中也可以充當(dāng)新的演員;
- 靈活性非常好。什么時(shí)候不想要適配器了,直接刪掉就可以了,基本上就類似一個(gè)靈活的構(gòu)件,想用就用,不想用就卸載。
缺點(diǎn)
- 過(guò)多使用適配器,會(huì)使系統(tǒng)非常零亂;
使用場(chǎng)景
- 有動(dòng)機(jī)地修改一個(gè)正常運(yùn)行的系統(tǒng)的接口。
注意
- 只有碰到無(wú)法改變?cè)性O(shè)計(jì)和代碼的情況下,才考慮適配器模式。