設(shè)計(jì)模式——適配器模式

什么是適配器模式?

將一個(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ì)和代碼的情況下,才考慮適配器模式。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容