文章目录
- [八、adapter 适配器模式](#八、adapter 适配器模式)
-
- [8.1 convert_lightning_to_usb](#8.1 convert_lightning_to_usb)
-
- [8.1.1 client_test.go](#8.1.1 client_test.go)
- [8.1.2 client.go](#8.1.2 client.go)
- [8.1.3 computer.go](#8.1.3 computer.go)
- [8.1.4 adapter.go](#8.1.4 adapter.go)
八、adapter 适配器模式
https://refactoringguru.cn/design-patterns/adapter
通常用于老旧系统, 或第三方系统, 提供一层适配器或插件, 做协议转换
PS: 如果开发新系统, 各层之间的解耦, 成为 bridge 桥接模式. 而如果是老系统则称为 adapter 适配器模式. 本质是一样的. 都是通过添加中间层实现的.
8.1 convert_lightning_to_usb
https://refactoringguru.cn/design-patterns/adapter/go/example
bash
08adapter/081convert_lightning_to_usb
├── adapter.go
├── client.go
├── client_test.go
├── computer.go
└── readme.md
8.1.1 client_test.go
go
package _81convert_lightning_to_usb
import "testing"
/*
=== RUN TestClient
insert lighting into computer
mac: insert into lightning port
insert lighting into computer
适配器: 将雷电口转换为USB口
windows: insert into usb port
--- PASS: TestClient (0.00s)
PASS
*/
func TestClient(t *testing.T) {
mac := &mac{}
windowsAdapter := &windowsAdapter{windowsComputer: &windows{}}
c := &client{}
c.InsertLightningIntoComputer(mac)
c.InsertLightningIntoComputer(windowsAdapter)
}
8.1.2 client.go
go
package _81convert_lightning_to_usb
import "fmt"
type client struct {
}
func (c *client) InsertLightningIntoComputer(computer computer) {
fmt.Println("insert lighting into computer")
computer.InsertIntoLightningPort()
}
8.1.3 computer.go
go
package _81convert_lightning_to_usb
import "fmt"
type computer interface {
InsertIntoLightningPort()
}
type mac struct{}
func (c *mac) InsertIntoLightningPort() {
fmt.Println("mac: insert into lightning port")
}
type windows struct{}
func (c *windows) InsertIntoUSBPort() {
// windows 只支持 usb 口, 不支持雷电口
fmt.Println("windows: insert into usb port")
}
8.1.4 adapter.go
go
package _81convert_lightning_to_usb
import "fmt"
type windowsAdapter struct {
windowsComputer *windows
}
func (a *windowsAdapter) InsertIntoLightningPort() {
fmt.Println("适配器: 将雷电口转换为USB口")
a.windowsComputer.InsertIntoUSBPort()
}