设计模式——适配器

1、引言

说起适配器,大家第一个想到的可能就是电源适配器。
电源适配器的作用想必同学们也都清楚,那就是将220伏高电压转换成想要的5伏至20伏左右稳定的低电压。
从某种程度上讲,编程中经常提起的适配器模式的原理与上面讲到的基本是一致的。

2、什么是适配器模式

用于将一个类的接口转换成另一个客户端所期望的接口形式。
适配器模式使得原本由于接口不兼容而无法一起工作的类可以协同工作。
通常的话,我们会在以下几种场景中使用到它。

  1. 对已存在的类库进行封装和适配,以便能够与其他新的系统或框架协同工作。
  2. 在不修改现有代码的情况下,适配新的接口规范。
  3. 在使用第三方组件时,适配器可以将其接口转换成自定义的接口形式。
  4. 将多个类或接口进行统一的适配,使得它们之间可以互相替换。

举个例子,大家在实际项目中使用第三方组件时,都会存在第三方组件设计的接口与项目实际使用的接口不一致,无法直接调用的情况。
这种场景下,我们通常会声明一个类对第三方接口进行封装,提供项目需要的接口。
以sqlite为例,sqlite只提供了C风格的接口,因此我们可以通过SqliteWrapper类来进行C++风格的封装。

class SqliteWrapper {
 private:
  sqlite3* m_conn;
  uint32_t m_retry;
  uint32_t m_timeout;
  sqlite3_stmt* m_stmt;

  std::string errStr;
  int errCode;

 public:
  SqliteWrapper(uint32_t retry, uint32_t timeout);

  virtual ~SqliteWrapper() { Close(); }

  virtual SQLErr Open(std::string& dbName, std::string& user, std::string& pass,
                      std::string& port);
  virtual SQLErr Close();
  virtual SQLErr Begin();
  virtual SQLErr Commit();
  virtual SQLErr RollBack();
  virtual SQLErr PrepareStatement(std::string& sql);
  virtual SQLErr Execute();
  virtual SQLErr Next();
  virtual SQLErr Statement(std::string& sql);
  virtual int GetLastError(std::string& err);

  void SetLastError(int action, const char* err);
  void SetLastError(int action);
  void ClearLastError();
};
  • 类适配器
    通过多重继承来适配接口。适配器类继承目标接口,并且同时继承了需要适配的类或接口。
  • 对象适配器
    通过组合关系来适配接口。适配器类持有适配者对象,并实现目标接口,将原始接口的调用委托给适配者对象。
  • 接口适配器(Interface Adapter):
    接口适配器也称为缺省适配器或者抽象适配器。
    接口适配器通过定义一个抽象适配器类,该类实现了目标接口并提供了默认空实现。
    其他具体适配器类可以选择性地覆盖抽象适配器类的方法来完成适配。
    接口适配器主要用于解决目标接口较多,但实际只需要使用其中部分方法的情况。

3、优缺点

  • 优点:
    1) 提供了一种解耦的方式,使得原本不兼容的类可以独立演化。
    2)可以复用已存在的类,实现了类的复用。
    3)可以在不修改已有代码的情况下进行接口的转换和适配。

  • 缺点:
    1)引入适配器类会增加代码的复杂性,使代码变得难以理解。
    2)不适合频繁变化的接口。如果接口经常发生变化,那么适配器的维护成本可能会很高,因为需要不断更新适配器以适应接口的变化。
    3)适配器模式可以弥补接口不匹配的问题,但有时也可能隐藏了系统设计上的问题。

4、装饰器与适配器的区别

装饰者模式适配器模式
定义装饰者和被装饰者都实现同一个接口,主要目的是为了拓展之后依旧保持OOP关系适配器和被适配者没有必然的联系,通常采用代理的形式进行包装
关系满足 is-a 的关系满足 has-a 的关系
功能注重覆盖、扩展注重兼容、转换
设计前置考虑后置考虑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值