适配器模式

适配器模式

代理、桥接、装饰器、适配器,这4种模式是比较常用的结构型设计模式.

它们之间的区别。

  • 代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。
  • 桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。
  • 装饰器模式:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。
  • 适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。

介绍

适配器模式**(Adapter Pattern),** 也称为包装器模式**(Wrapper Pattern),** 是一种结构型设计模式。该模式允许对象的接口与客户端的期望接口不匹配时协同工作. 适配器模式创建一个包装类, 该包装类包含了原始类的实例, 并实现了客户端所期望的接口. 通过这种方式, 适配器模式允许原始类与客户端协同工作, 尽管它们的接口不一致.

强调一个类的接口适配成另一个类的接口, 使原本不兼容的类能够协同工作.

通常有两种主要类型:

类适配器, 使用多继承或接口实现来适配接口.

对象适配器, 使用组合来包装原始类的实例, 以实现新的接口.

定义

想象你有一部新的手机,它使用USB-C充电接口,但你在家里只有一个旧的手机充电器,它使用Micro-USB接口。你不想购买一个新的充电器,而是想找到一种方法,使旧的充电器与你的新手机兼容。这就是适配器模式的应用。

在这个例子中:

  1. 问题: 你有一个新的手机和一个旧的充电器,它们的接口不匹配,但你想要充电。
  2. 解决方案(适配器): 你可以获得一个USB-C到Micro-USB适配器。这个适配器连接到你的新手机的USB-C接口,并允许你将旧的Micro-USB充电器连接到它。
  3. 效果: 现在,你可以使用旧的充电器来为新手机充电,而无需购买新的充电器。适配器充当一个中间层,使不兼容的部分协同工作。

使用usb-c的手机

class USB_CPhone{
public:
  const std::string chargeWithUSB_C() {
    return "Charging with USB-C";
  }
};

旧手机充电线

class MicroUSBCharger {
public:
  const std::string chargeWithMicroUSB() {
    return "Charging with Micro-USB";
  }
};

适配器

//对象适配器
class ObjectChargeAdapter: public USB_CPhone {
  MicroUSBCharger microUSBCharger;
public:
  const std::string chargeWithUSB_C() {
    return microUSBCharger.chargeWithMicroUSB();
  }
};

//类适配器
class ClassChargeAdapter: public MicroUSBCharger ,private USB_CPhone {
public:
  const std::string chargeWithUSB_C() {
    return chargeWithMicroUSB();
  }
};

调用

ObjectChargeAdapter new_phone;
std::cout << new_phone.chargeWithUSB_C() << std::endl;
ClassChargeAdapter new_phone1;
std::cout << new_phone1.chargeWithUSB_C() << std::endl;

效果

./bin/design/Adapter
Charging with Micro-USB
Charging with Micro-USB

适用

  1. 接口不匹配: 当你需要使用一个已经存在的类,但它的接口与你的需求不匹配时,适配器模式很有用。这可以是由于新旧系统之间接口不一致,或者是由于第三方库的接口与你的代码不兼容。
  2. 代码复用: 适配器模式有助于重用现有的类,而不必对其进行修改。这对于避免修改稳定的代码或依赖于外部库的代码非常有用。
  3. 无法修改源代码: 当你不能修改原始类的源代码,但需要使其与其他类协同工作时,适配器模式是一种有效的解决方案。
  4. 兼容性: 当你希望让不同接口的类在一起工作,以提高系统的整体兼容性时,适配器模式非常有帮助。
  5. 新旧系统集成: 在迁移到新系统时,你可能需要将旧系统的组件与新系统集成。适配器模式可以帮助你连接新旧系统的组件,以确保它们能够协同工作。
  6. 接口的抽象: 适配器模式可以用来创建更抽象的接口,使得客户端代码更灵活和独立于具体类的实现。

总之,适配器模式在需要将不兼容的接口进行协调工作、重用现有代码、维护代码的稳定性和提高系统的可扩展性时非常有用。它有助于降低代码的耦合度,并使不同组件能够相互协同工作,同时保持代码的整洁和易于维护。

那在实际的开发中,什么情况下才会出现接口不兼容呢?

  • 封装有缺陷的接口设计
  • 统一多个类的接口设计
  • 替换依赖的外部系统
  • 兼容老版本接口
  • 适配不同格式的数据
    代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值