一文搞懂设计模式值适配器模式

2023-12-18 13:52:04

hello,大家好,我是晴天,本周我们继续学习设计模式系列,本周将要一起学习的模式——适配器模式。

目录

场景引入

日常生活中,我们经常会遇到手机没电需要找充电器充电的场景,对于苹果手机和安卓手机,就需要找到不同的充电线来充电,苹果需要使用lighting接口(iPhone15之后也使用type-c了)而安卓使用type-c接口。如果使用苹果手机,但是找到的充电器使用type-c,就没办法直接进行充电,就还需要找到一个type-c转lighting的适配器,这样才能够让苹果手机使用type-c充电线进行充电。

适配器转换图

什么是适配器模式

适配器模式(Adapter Pattern)是一种结构性设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。这种模式通常用于使原本由于接口不兼容而不能一起工作的类能够协同工作。

适配器模式类图
上面的类图一共包含5部分

  1. server接口:对客户提供统一的服务 service()
  2. ConcreteServerA和ConcreteServerB:拥有service()方法的具体类,可以直接对客户提供服务
  3. AdaptedServerC:拥有不同的service()方法,不能够直接对客户提供服务
  4. AdapterC:适配器,能够把AdaptedServerC提供的方法转换成能够对客户提供的方法
  5. 客户端:需要使用server提供的service()方法

为什么需要适配器模式

适配器模式是为了解决接口不兼容的问题,当现有的类无法直接满足系统的需求或与其他类协同工作时,适配器模式提供了一种灵活的解决方案。

代码实战

接下来我们就把前面提到的充电器的例子来做一个代码实战。

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

代码解释

  1. 定义了一个IPhone,内部有一个成员是lighting,需要使用lighting进行充电
  2. 定义了两种不同的充电接口,lighting和type-c
  3. 定义了type-c转lighting的适配器
  4. 对iphone使用经过适配器转换的type-c接口进行充电

适用场景

当你使用某个对象提供的方法时,发现该对象的方法不能直接用,这时候可以对该对象加一个适配器,使得对外提供的方法能够统一,内部还是继续使用原始方法。

适配器模式允许你创建一个中间层, 其可作为代码与遗留类、 第三方类或提供怪异接口的类之间的转换器。

优点:

  1. 代码复用: 适配器模式允许现有的类与新代码协同工作,而无需修改现有的类。这样可以实现代码的复用,减少重复劳动。

  2. 解耦合: 适配器模式将目标类和适配者类解耦合,使它们可以独立演化。适配器充当一个中间层,将目标类和适配者类连接起来,减少它们之间的直接依赖。

  3. 系统扩展性: 可以通过引入新的适配器来适配新的类,而无需修改已有的代码。这有助于系统的扩展,使其更容易应对变化。

  4. 符合开闭原则: 适配器模式支持系统的开闭原则,即对扩展开放,对修改关闭。可以通过添加新的适配器来扩展系统,而不需要修改已有的代码。

缺点:

  1. 过多的适配器: 如果系统中过多地使用适配器模式,可能会导致代码变得复杂难以理解。因此,在使用适配器模式时需要注意平衡,避免过度使用。

  2. 运行效率: 适配器模式可能会引入一些额外的运行时开销,因为需要通过适配器进行转换。在某些对性能要求极高的系统中,这可能成为一个考虑因素。

  3. 不适合所有情况: 适配器模式并不是所有问题的通用解决方案。在某些情况下,重构现有代码可能是更好的选择,而不是引入适配器。

总结

本文介绍了什么是适配器模式,适配器模式就是把不符合用户使用格式的接口经过适配器转换,转换成用户能够使用的方法;介绍了为什么需要适配器模式,因为服务提供者提供的接口不统一,用户无法直接使用,需要统一适配成用户能够使用的通用接口方法;最后介绍了一个手机充电器的demo供大家学习。

写在最后

感谢大家的阅读,晴天将继续努力,分享更多有趣且实用的主题,如有错误和纰漏,欢迎留言给予指正。 更多文章敬请关注作者个人公众号?晴天码字。 我们下期不见不散,to be continued…

文章来源:https://blog.csdn.net/all_about_WZY/article/details/135059037
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。