简介
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。
适配器模式通常涉及到三个角色:
- 目标接口(Target Interface)
- 适配器(Adapter)
- 被适配者(Adaptee)
比如车上都有点烟孔,但是如何给手机充电呢?就需要一个点烟孔适配器来做转换成USB接口,然后来给你适配数据线。 目标接口就是USB接口,适配器就是那一坨东西,被适配者就是点烟孔。
Demo
// USB 目标接口
type USB interface {
Charge()
}
// CigaretteLighter 被适配者,点烟孔
type CigaretteLighter struct {
ConnectedDevice string
}
func (c *CigaretteLighter) PowerSupply() string {
return fmt.Sprintf("Power supply from cigarette lighter to %s", c.ConnectedDevice)
}
// Adapter 适配器 那一坨东西
type Adapter struct {
CigaretteLighter *CigaretteLighter // 它需要插在点烟孔上面
}
// Charge 转成USB接口
func (adapter *Adapter) Charge() {
fmt.Println(adapter.CigaretteLighter.PowerSupply())
}
test
func TestAdapter(t *testing.T) {
cigaretteLighter := &CigaretteLighter{
ConnectedDevice: "USB Charger",
}
adapter := &Adapter{
CigaretteLighter: cigaretteLighter,
}
adapter.Charge()
}
USB 接口是目标接口,定义了客户端期望的接口。CigaretteLighter 是被适配者,它有一个 PowerSupply 方法用于供电。Adapter 是适配器,它实现了 USB 接口,并在其内部持有一个 CigaretteLighter 实例。
创建了被适配者 cigaretteLighter 和适配器 adapter,然后通过目标接口调用适配器的 Charge 方法。这样,我们成功地将汽车电源插座适配成了 USB 接口。
这个例子展示了如何使用适配器模式,将原本不兼容的点烟孔(汽车电源插座)适配成了客户端期望的 USB 接口,以便连接 USB 充电器等设备。适配器模式使得不同接口的设备可以在汽车上协同工作。
作用和场景
接口不兼容问题
当现有的接口和系统需要的接口不兼容时,使用适配器模式可以使它们协同工作。
旧代码复用
在进行系统升级或重构时,可能需要使用已有的旧代码,适配器模式可以帮助新代码与旧代码协同工作。
封装实现细节
适配器可以将被适配者的实现细节封装起来,对客户端隐藏实现细节。
多态性增强
适配器模式可以增强类的多态性,使得不同类的对象具有相同的接口。
总体而言,适配器模式适用于需要解决接口不兼容问题、复用旧代码、封装实现细节等场景。通过引入适配器,可以使得不同接口的类能够协同工作,提高系统的灵活性和可维护性。