一文搞懂设计模式之适配器模式
一文搞懂设计模式之适配器模式
在日常生活中,我们常常会面临手机电量耗尽需要充电的情况。对于苹果手机和安卓手机,我们需要不同的充电线来进行充电。苹果手机使用Lightning接口(iPhone 15之后也开始使用Type-C),而安卓手机则采用Type-C接口。如果我们使用的是苹果手机,但找到的充电器是Type-C接口,那就无法直接充电了。这时,我们需要找到一个Type-C转Lightning的适配器,以便让苹果手机能够使用Type-C充电线进行充电。
什么是适配器模式
适配器模式(Adapter Pattern)是一种结构性设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。这种模式通常用于使原本由于接口不兼容而不能一起工作的类能够协同工作。
上面的类图一共包含5部分
- server接口:对客户提供统一的服务 service()
- ConcreteServerA和ConcreteServerB:拥有service()方法的具体类,可以直接对客户提供服务
- AdaptedServerC:拥有不同的service()方法,不能够直接对客户提供服务
- AdapterC:适配器,能够把AdaptedServerC提供的方法转换成能够对客户提供的方法
- 客户端:需要使用server提供的service()方法
为什么需要适配器模式
适配器模式的设计目的是解决接口不兼容的问题。当现有的类无法直接满足系统需求或与其他类协同工作时,适配器模式为这种情况提供了一种灵活的解决方案。
Code实战
package mainimport (“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 LineTypeCtypec = LineTypeC{“type-c”}// typec的适配器,适配成lightingvar ac AdapterTypeCac = AdapterTypeC{typec}// 定义一个iphone,需要使用lighting充电var iphone IPhoneiphone = IPhone{&ac}iphone.charge()}// 输出:我是type-c使用了适配器的方法,变成了lighting
代码解释
我们创建了一个 iPhone 类,其中内部包含一个名为 lighting 的成员,需要使用 lighting 接口进行充电。我们还定义了两种不同的充电接口,分别是 lighting 和 type-c。为了实现 iPhone 充电,我们设计了一个 type-c 转 lighting 的适配器。最终,通过适配器,我们能够使用经过转换的 type-c 接口为 iPhone 进行充电。
适用场景
当使用某个对象的方法时发现直接使用不太方便,可以引入一个适配器,使得对外提供的方法变得统一,而内部仍然使用原始的方法。
适配器模式允许你创建一个中间层,作为代码与遗留类、第三方类或提供特殊接口的类之间的转换器。这样,通过适配器,你能够在统一的接口下使用各种不同的类,无需直接修改它们的代码。
To sum up
本文介绍了什么是适配器模式,适配器模式就是把不符合用户使用格式的接口经过适配器转换,转换成用户能够使用的方法;介绍了为什么需要适配器模式,因为服务提供者提供的接口不统一,用户无法直接使用,需要统一适配成用户能够使用的通用接口方法。