hello,大家好,我是晴天,本周我们继续学习设计模式系列的又一个模式------适配器模式
场景引入
日常生活中,我们经常会遇到手机没电需要找充电器充电的场景,对于苹果手机和安卓手机,就需要找到不同的充电线来充电,苹果需要使用lighting接口(iPhone15之后也使用type-c了)而安卓使用type-c接口。如果使用苹果手机,但是找到的充电器使用type-c,就没办法直接进行充电,就还需要找到一个type-c转lighting的适配器,这样才能够让苹果手机使用type-c充电线进行充电。
什么是适配器模式
适配器模式(Adapter Pattern)是一种结构性设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。这种模式通常用于使原本由于接口不兼容而不能一起工作的类能够协同工作。
上面的类图一共包含5部分
- server接口:对客户提供统一的服务 service()
- ConcreteServerA和ConcreteServerB:拥有service()方法的具体类,可以直接对客户提供服务
- AdaptedServerC:拥有不同的service()方法,不能够直接对客户提供服务
- AdapterC:适配器,能够把AdaptedServerC提供的方法转换成能够对客户提供的方法
- 客户端:需要使用server提供的service()方法
为什么需要适配器模式
适配器模式是为了解决接口不兼容的问题,当现有的类无法直接满足系统的需求或与其他类协同工作时,适配器模式提供了一种灵活的解决方案。
代码实战
go
package main
import (
"fmt"
)
// iPhone手机需要使用电源线
type Lighting interface {
UsingLighting()
}
// iPhone原装电源线 可以直接用
type LineLighting struct {
name string
}
func (l *LineLighting) UsingLighting() {
fmt.Println("我是" + l.name)
}
// type-c电源线 需要适配器转换转接口
type LineTypeC struct {
name string
}
func (l *LineTypeC) UsingTypeC() {
fmt.Println("我是" + l.name)
}
// type-c转lighting的适配器
type AdapterTypeC struct {
lc LineTypeC
}
func (a *AdapterTypeC) UsingLighting() {
a.lc.UsingTypeC()
fmt.Println("使用了适配器的方法,变成了lighting")
}
type IPhone struct {
lineLighting Lighting
}
func (i *IPhone) charge() {
i.lineLighting.UsingLighting()
}
func main() {
// 一根typec的数据线
var typec LineTypeC
typec = LineTypeC{"type-c"}
// typec的适配器,适配成lighting
var ac AdapterTypeC
ac = AdapterTypeC{typec}
// 定义一个iphone,需要使用lighting充电
var iphone IPhone
iphone = IPhone{&ac}
iphone.charge()
}
// 输出:
我是type-c
使用了适配器的方法,变成了lighting
代码解释
- 定义了一个IPhone,内部有一个成员是lighting,需要使用lighting进行充电
- 定义了两种不同的充电接口,lighting和type-c
- 定义了type-c转lighting的适配器
- 对iphone使用经过适配器转换的type-c接口进行充电
适用场景
当你使用某个对象提供的方法时,发现该对象的方法不能直接用,这时候可以对该对象加一个适配器,使得对外提供的方法能够统一,内部还是继续使用原始方法。
适配器模式允许你创建一个中间层, 其可作为代码与遗留类、 第三方类或提供怪异接口的类之间的转换器。
总结
本文介绍了什么是适配器模式,适配器模式就是把不符合用户使用格式的接口经过适配器转换,转换成用户能够使用的方法;介绍了为什么需要适配器模式,因为服务提供者提供的接口不统一,用户无法直接使用,需要统一适配成用户能够使用的通用接口方法;最后介绍了一个手机充电器的demo供大家学习。
写在最后
感谢大家的阅读,晴天将继续努力,分享更多有趣且实用的主题,如有错误和纰漏,欢迎留言给予指正。 更多文章敬请关注作者个人公众号 晴天码字。 我们下期不见不散,to be continued...