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

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…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
责任链设计模式是一种行为型设计模式,用于将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。该模式将这些对象串成链,并沿着这条链传递请求,直到有一个对象能够处理它为止。 责任链模式的核心是定义一个处理请求的抽象类或接口,然后让多个具体的处理者对象继承或实现这个类/接口。每个具体的处理者对象都包含一个对下一个处理者对象的引用,形成一个链式结构。 当一个请求进入责任链时,责任链中的每个处理者都有机会处理该请求。如果可以处理请求,则进行处理;如果不能处理,则将请求传递给下一个处理者,直到有一个处理者能够处理它。 责任链模式的关键点是要找到合适的处理者顺序和条件。通常情况下,责任链模式适用于以下情况: 1. 有多个对象可以处理同一类型的请求,但具体由哪个对象来处理由运行时决定。 2. 不明确请求的接收者,希望请求在一个对象链中流动,直到被处理。 3. 需要动态地指定可以处理请求的对象集合。 使用责任链模式可以实现请求发送者和接收者的解耦,增加代码的灵活性和可扩展性。但同时也需要注意责任链的长度和效率问题,避免责任链过长或造成性能问题。 总结一下,责任链设计模式是一种将请求发送者和接收者解耦的设计模式,通过将多个处理者对象串成链,沿着这条链传递请求,直到有一个处理者能够处理它。这样可以增加代码的灵活性和可扩展性,适用于有多个对象可以处理同一类型请求的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值