结构型:一. 适配器模式
适配器模式是什么
适配器模式(Adapter Design Pattern)适配器是一种结构型设计模式, 用来将不兼容的接口转换为兼容的接口。适配器可担任两个对象间的转换器, 它会接收对于一个对象的调用, 并将其转换为另一个对象可识别的格式和接口。
为什么用适配器模式
两个对象直接由于格式或者接口不兼容不能直接调用,所以使用适配器转换为格式或者接口。适配器不会影响原有的代码及功能。
适配器模式怎么实现
客户端
客户端通过USB来连接电脑,并且windows实现了这个接口,可以正常使用,客户端可以和windows传输数据,一切很完美。
type Computer interface {
USB()
}
type Client struct {
}
func (c *Client) ToUSB(com Computer) {
com.USB()
}
type Windows struct {
}
func (w *Windows) USB() {
fmt.Println("连接成功,传输数据")
}
未知服务
这时候有个Mac电脑,它没有提供USB接口,只提供Lightning来和其他设备传输数据,这种情况我们怎么和上面的Client连接呢?Client设备只能连接提供有USB接口的电脑。
type Mac struct {
}
func (m *Mac) Lightning() {
fmt.Println("连接成功,传输数据")
}
适配器
该适配器可以将Lightning转化为USB接口,这样就可以和上面的Client连接。
type Adapter struct {
Mac
}
func (a *Adapter) USB() {
a.Lightning()
}
main.go调用
package main
import (
"demo/adapter"
)
func main() {
windows := new(adapter.Windows)
new(adapter.Client).ToUSB(windows)
a := new(adapter.Adapter)
new(adapter.Client).ToUSB(a)
}
// 运行结果:
连接成功,传输数据
连接成功,传输数据
优点
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,程序员不需要修改原有代码。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
- 在很多业务场景中符合开闭原则。
缺点
- 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。