適配器模式(Adapter Pattern) :將一個接口轉換成客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作,其別名爲包裝器(Wrapper)。適配器模式既可以作爲類結構型模式,也可以作爲對象結構型模式。
適配器模式包含如下角色:
Target:目標抽象類
Adapter:適配器類
Adaptee:適配者類
Client:客戶類
實現
- Target:目標抽象類
type LegacyPrinter interface {
Print(s string) string
}
- Adaptee:適配者類
type MyLegacyPrinter struct{}
func (l *MyLegacyPrinter) Print(s string) (newMsg string) {
newMsg = fmt.Sprintf("Legacy Printer: %s\n", s)
println(newMsg)
return
}
- Client:客戶類
type ModernPrinter interface {
PrintStored() string
}
- Adapter:適配器類
type PrinterAdapter struct {
OldPrinter LegacyPrinter
Msg string
}
func (p *PrinterAdapter) PrintStored() (newMsg string) {
if p.OldPrinter != nil {
newMsg = fmt.Sprintf("Adapter: %s", p.Msg)
newMsg = p.OldPrinter.Print(newMsg)
} else {
newMsg = p.Msg
}
return
}
測試
func TestAdapter(t *testing.T) {
msg := "Hello World!"
adapter := PrinterAdapter{OldPrinter: &MyLegacyPrinter{}, Msg: msg}
returnedMsg := adapter.PrintStored()
if returnedMsg != "Legacy Printer: Adapter: Hello World!\n" {
t.Errorf("Message didn't match: %s\n", returnedMsg)
}
adapter = PrinterAdapter{OldPrinter: nil, Msg: msg}
returnedMsg = adapter.PrintStored()
if returnedMsg != "Hello World!" {
t.Errorf("Message didn't match: %s\n", returnedMsg)
}
}
測試結果:
=== RUN TestAdapter
Legacy Printer: Adapter: Hello World!
--- PASS: TestAdapter (0.00s)
PASS