适配器模式
概述
适配器其实非常好理解,放到生活中来,我们身边处处都有这样的例子,最常见的是用的比较多的各种转接线(如:USB 转 Type-C),有了这个"适配器",我们就能够将电脑和手机等设备相进行连接,而不需要改动电脑/手机的原有接口。
示例
回到编程的世界中,假设我们的某个程序一直依赖一个很久远的接口 OldBusinessInterface
,这个时候由于业务需求,需要使用到比较新的接口 NewBusinessInterface
,由于历史原因将不对旧的代码进行修改 ,因此目前的方案是将使用 适配器模式 去让 NewBusinessInterface
去适配 OldBusinessInterface
。
> 代码在线运行 <
go
package main
import "fmt"
// OldBusinessInterface 这是旧的接口
type OldBusinessInterface interface {
OldBusinessMethodA(str string) int
OldBusinessMethodB()
}
// OldBusiness 这是旧的业务类,实现了旧的接口
type OldBusiness struct {
}
func (o *OldBusiness) OldBusinessMethodA(str string) int {
fmt.Println("OldBusinessMethodA is called")
return len(str)
}
func (o *OldBusiness) OldBusinessMethodB() {
fmt.Println("OldBusinessMethodB is called")
}
// NewBusinessInterface 这是新的接口
type NewBusinessInterface interface {
NewBusinessMethodA(str string) int
}
// NewBusiness 这是新的业务类,实现了新的接口
type NewBusiness struct {
}
func (n *NewBusiness) NewBusinessMethodA(str string) int {
fmt.Println("NewBusinessMethodA is called")
return len(str)
}
// OldBusinessMethod 这是旧的业务方法,依赖于旧的接口,但是新的业务类没有实现旧的接口
func OldBusinessMethod(a OldBusinessInterface) {
a.OldBusinessMethodA("hello")
}
// Adapter 这是适配器,实现了旧的接口,但是依赖于新的接口,这样就可以在旧的业务方法中使用新的业务类了
type Adapter struct {
NewBusinessInterface
}
func (a *Adapter) OldBusinessMethodA(str string) int {
fmt.Println("[Adapter] OldBusinessMethodA is called")
return a.NewBusinessMethodA(str)
}
func (a *Adapter) OldBusinessMethodB() {
fmt.Println("[Adapter] OldBusinessMethodB is called")
}
func main() {
// 旧的使用姿势
OldBusinessMethod(&OldBusiness{})
fmt.Println("------------------")
// 使用适配器,可以在旧的业务方法中使用新的业务类了
OldBusinessMethod(&Adapter{&NewBusiness{}})
}
运行结果:
bash
OldBusinessMethodA is called
------------------
[Adapter] OldBusinessMethodA is called
NewBusinessMethodA is called
通过适配器,我们能够将 B 接口变成 A 接口,通过这个方式,我们不需要再重新写一个新的实现类,而是只需要增加一个 适配器 ,这种感觉就是:你现在只有一个安卓充电线,但是你的手机是 Type-C
的接口,这个时候你只需要通过一个 转接线 就可以让 Type-C
接口的手机使用安卓充电线,而不用重新再买一个 Type-C
接口的充电器,这确实能够方便很多,当然,重新买一个充电器也并不是说不可取,这需要结合实际场景考虑各方面的因素来选择最合适的方案。
适配器的种类
实际上,适配器有"两种":对象适配器
和 类适配器
。
-
对象适配器
-
类适配器
其实本质上只是适配的目标不同而已,我们刚才的代码是针对接口而做的适配,其实就是对象适配器 ,对于类适配器,其实就是针对类型进行适配(在 Java 中,就是对 Class 进行的适配),使用此方式的前提条件是 编程语言支持多继承 (如图,Adapter
继承了目标类和待适配的类)。
小结
-
模式定义
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
总结以上的内容,说白了,适配器其实就是一个中间层,可以让原本不兼容的接口转换 成目标接口,最核心的是 "转换" 二字。如果你了解过外观模式和装饰模式,你可能会对他们三个感到有些困惑,分不清他们的差异,不用担心,我在之后的文章会对他们三个的差异做出解释。
以上便是本篇的全部内容了,如果内容存在又问题的地方欢迎指点。