手擼golang 結構型設計模式 適配器模式

手擼golang 結構型設計模式 適配器模式

緣起

最近複習設計模式
拜讀譚勇德的<<設計模式就該這樣學>>
本系列筆記擬採用golang練習之golang

適配器模式

適配器模式(Adapter Pattern)又叫做變壓器模式,它的功能是將一個類的接口變成客戶端所指望的另外一種接口,從而使本來因接口不匹配而致使沒法在一塊兒工做的兩個類可以一塊兒工做,屬於結構型設計模式。
_設計模式

場景

  • 某智能家居應用, 可接入並顯示溫度計信息
  • 系統設計的溫度計接口, 採用的是攝氏度單位
  • 現按客戶需求, 要接入某進口款溫度計, 廠家提供的sdk只提供華氏度的溫度信息
  • 根據適配器模式, 在不修改系統原有接口的狀況下, 兼容新設備接入
  • 華氏度 = 32+ 攝氏度 × 1.8, 攝氏度 = (華氏度 - 32) ÷ 1.8

設計

  • IThermometer: 現有系統的溫度計接口, 溫度單位爲攝氏度. 本次更新但願保持接口不變, 以避免影響現有系統.
  • IThermometerFactory: 現有系統的溫度計工廠接口. 本次更新但願保持接口不變, 以避免影響現有系統.
  • ISpecialThermometer: 廠家sdk提供的溫度計接口, 溫度單位爲華氏度
  • tMockSpecialThermometer: 廠家sdk提供的溫度計實現
  • tMockSpecialAdapter: 根據適配器模式, 實現的溫度計適配器, 爲新溫度計適配現有系統的接口
  • tMockSpecialFactory: 新溫度計的工廠類, 實現IThermometerFactory接口

單元測試

adapter_pattern_test.gooop

package structural_patterns

import (
    "learning/gooop/structural_patterns/adapter"
    "testing"
)

func Test_AdapterPattern(t *testing.T) {
    factory := adapter.SpecialThermometerFactory
    thermometer := factory.Create("This is some configuration")
    t.Logf("centigrade = %v", thermometer.Centigrade())
}

測試輸出

$ go test -v adapter_pattern_test.go 
=== RUN   Test_AdapterPattern
    adapter_pattern_test.go:11: centigrade = 26.5
--- PASS: Test_AdapterPattern (0.00s)
PASS
ok      command-line-arguments  0.003s

IThermometer.go

現有系統的溫度計接口, 溫度單位爲攝氏度.單元測試

package adapter

// 現有系統的溫度計接口, 攝氏度
type IThermometer interface {
    Centigrade() float64
}

IThermometerFactory.go

現有系統的溫度計工廠接口.測試

package adapter

type IThermometerFactory interface {
    Create(config string) IThermometer
}

ISpecialThermometer.go

廠家sdk提供的溫度計接口, 溫度單位爲華氏度設計

package adapter

// 新接入的溫度計, 華氏度
type ISpecialThermometer interface {
    Fahrenheit() float64
}

tMockSpecialThermometer.go

廠家sdk提供的溫度計實現code

package adapter

type tMockSpecialThermometer struct {
    mAddress string
}

func newMockSpecialThermometer(address string) ISpecialThermometer {
    return &tMockSpecialThermometer{
        address,
    }
}

func (me *tMockSpecialThermometer) Fahrenheit() float64 {
    return 79.7
}

tMockSpecialAdapter.go

根據適配器模式, 實現的溫度計適配器, 爲新溫度計適配現有系統的接口接口

package adapter

type tMockSpecialAdapter struct {
    mOrigin ISpecialThermometer
}


func newSpecialAdapter(origin ISpecialThermometer) IThermometer {
    return &tMockSpecialAdapter{
        origin,
    }
}

func (me *tMockSpecialAdapter) Centigrade() float64 {
    return (me.mOrigin.Fahrenheit() - 32) * 5 / 9
}

tMockSpecialFactory.go

新溫度計的工廠類, 實現IThermometerFactory接口ci

package adapter

type tMockSpecialFactory struct {
}

func newMockSpecialFactory() IThermometerFactory {
    return &tMockSpecialFactory{}
}

func (me *tMockSpecialFactory) Create(config string) IThermometer {
    t := newMockSpecialThermometer(me.parseAddress(config))
    return newSpecialAdapter(t)
}

func (me *tMockSpecialFactory) parseAddress(config string) string {
    return "http://localhost:8080"
}


var SpecialThermometerFactory IThermometerFactory = newMockSpecialFactory()

適配器模式小結

適配器模式的優勢
(1)能提升類的透明性和複用,但現有的類複用不須要改變。
(2)適配器類和原角色類解耦,提升程序的擴展性。
(3)在不少業務場景中符合開閉原則。
適配器模式的缺點
(1)適配器編寫過程須要結合業務場景全面考慮,可能會增長系統的複雜性。
(2)增長代碼閱讀難度,下降代碼可讀性,過多使用適配器會使系統代碼變得凌亂。
_
(end)string

相關文章
相關標籤/搜索