Bootstrap

C++ 设计模式:适配器模式(Adapter Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 门面模式
链接:C++ 设计模式 - 代理模式
链接:C++ 设计模式 - 中介者

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口,从而使原本由于接口不兼容而无法一起工作的类可以协同工作。

1.问题分析

在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。为了让这些类能够协同工作,我们需要一种方法来“适配”它们的接口。

2.实现步骤

  1. 定义目标接口(Target Interface):这是客户期望使用的接口。
  2. 定义现有接口(Adaptee Interface):这是需要适配的现有接口。
  3. 创建适配器类(Adapter Class):适配器类实现目标接口,并在内部调用现有接口的方法。

3.代码示例

3.1.定义旧接口(Adaptee)

class OldInterface {
 public:
  void oldRequest() { std::cout << "Old request" << std::endl; }
};

3.2.定义新接口(Target)

class NewInterface {
 public:
  virtual ~NewInterface() = default;
  virtual void newRequest() = 0;
};

3.3.定义对象适配器(Adapter)

class ObjectAdapter : public NewInterface {
 public:
  ObjectAdapter(std::unique_ptr<OldInterface> adaptee) : adaptee_(std::move(adaptee)) {}

  void newRequest() override { adaptee_->oldRequest(); }

 private:
  std::unique_ptr<OldInterface> adaptee_;
};

3.4.客户端代码

int main() {
  std::unique_ptr<OldInterface> oldInterface = std::make_unique<OldInterface>();
  std::unique_ptr<NewInterface> adapter = std::make_unique<ObjectAdapter>(std::move(oldInterface));
  adapter->newRequest();  // 输出 "Old request"
  return 0;
}

4.总结

适配器模式的核心思想是通过引入一个适配器类,将现有接口转换为目标接口。适配器类实现目标接口,并在内部持有现有接口的实例,通过调用现有接口的方法来实现目标接口的方法。

适配器模式有两种主要形式:

  1. 类适配器:通过多重继承实现适配器模式,适配器类继承目标接口和现有接口。这种方式在C++中不常用,因为多重继承可能带来复杂性。
  2. 对象适配器:通过组合实现适配器模式,适配器类持有现有接口的实例。这种方式更为常见,因为它更灵活且符合单一职责原则。
;