適配器模式

概念

適配器模式:將一個(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)用到被適配的接口。

  1. 定義一個(gè)一個(gè)目標(biāo)接口, 目標(biāo)接口包含需要的方法接口。
  2. 定義一個(gè)需要被適配的結(jié)構(gòu)體的接口, 這個(gè)接口方法是需要具體調(diào)用的方法。
  3. 定義一個(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)體接口, 將接口返回出去。
  4. 定義一個(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)
}

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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