提示:文章

前言

前期疑问:
本文目标:


一、背景

最近

二、设计模式

1、代理模式

参考的这篇文章,代理模式(Proxy)

同时这篇文章还引用了另一篇文章,这篇文章使用了租客租房和中介的例子。设计模式之代理模式

2、适配器模式

这次狙击适配器模式

看了这篇文章,感觉讲的还算容易理解

C++设计模式-适配器模式

文中描述了适配器的一个常规用法:

举一个常用的场景:
有一个设备管理类,可以动态增加和删除设备,并且还可以控制设备打开或者关闭,这个类实现之后,不用管设备具体类型,后期有新的奇奇怪怪的设备都可以兼容而不需要修改这个设备管理类的代码。

/**
 * @brief 设备控制统一接口
 */
class DeviceControl {
 public:
  DeviceControl() {}
  virtual ~DeviceControl() {}

 public:
  virtual void TurnOn() = 0;	// 统一的设备打开接口
  virtual void TurnOff() = 0;   // 统一的设备关闭接口
};

现在有一个电风扇设备,其接口假如是厂家提供的SDK,我们自己没法修改

/**
 * @brief 风扇设备控制接口
 */
class Fan {
 public:
  Fan() {}
  ~Fan(){};

 public:
  void Open() { std::cout << "open fan" << std::endl; };
  void Close() { std::cout << "close fan" << std::endl; };
};

还有一个电视机设备,其接口假如是厂家提供的SDK,我们自己没法修改

/**
 * @brief 电视机设备控制接口
 */
class TV {
 public:
  TV() {}
  ~TV(){};

 public:
  void Switch(bool value) {
    if (value == true)
      std::cout << "open tv" << std::endl;
    else
      std::cout << "close tv" << std::endl;
  };
};

现在要通过设备控制统一接口去控制上面的风扇和电视机,就需要实现两个适配器
风扇适配器:

/**
 * @brief 风扇适配器
 */
class FanAdapter : public DeviceControl {
 public:
  FanAdapter() : fan_(std::make_shared<Fan>()) {}
  virtual ~FanAdapter() override {}

 public:
  void TurnOn() override { fan_->Open(); };		// 风扇适配器中实际调用了风扇厂家提供的接口
  void TurnOff() override { fan_->Close(); };   // 风扇适配器中实际调用了风扇厂家提供的接口

 private:
  std::shared_ptr<Fan> fan_;
};

电视机适配器:

/**
 * @brief 电视机适配器
 */
class TVAdapter : public DeviceControl {
 public:
  TVAdapter() : tv_(std::make_shared<TV>()) {}
  virtual ~TVAdapter() override {}

 public:
  void TurnOn() override { tv_->Switch(true); };    // 电视机适配器中实际调用了电视机厂家提供的接口
  void TurnOff() override { tv_->Switch(false); };  // 电视机适配器中实际调用了电视机厂家提供的接口

 private:
  std::shared_ptr<TV> tv_;
};

客户端测试程序:

// 客户端测试程序
int main() {
  std::vector<std::shared_ptr<DeviceControl>> devices;	// 设备列表
  devices.emplace_back(std::make_shared<FanAdapter>()); // 添加设备
  devices.emplace_back(std::make_shared<TVAdapter>());  // 添加设备

  std::cout << "open all devices" << std::endl;
  for (const auto& v : devices) {
    v->TurnOn();
  }

  std::cout << "close all devices" << std::endl;
  for (const auto& v : devices) {
    v->TurnOff();
  }

  return 0;
}

运行结果

open all devices
open fan
open tv
close all devices
close fan
close tv

在上面这个例子中,设备控制统一接口中,有设备打开和关闭两个统一接口,而风扇和电视机也有其打开和关闭的接口,不过他们的接口并不统一,电视机的打开和关闭甚至使用了同一个接口,通过传入不同参数来区分是打开还是关闭,而通过给每个设备实现一个适配器,这样就可以将他们的接口统一起来,如果后面还要控制更多的其他设备,只需要给每个设备都实现一个适配器即可,无需修改已有的代码,这也符合开闭原则。

2.1 总结

适配器模式的优点主要包括:
(1)提高类的透明性和复用性: 适配器模式可以让类在现有的基础上进行复用,而不需要做出任何改变,这有助于避免大规模改写现有代码。
(2)解耦目标类和适配器类: 通过使用适配器模式,目标类和适配器类可以实现解耦,从而提高程序的扩展性。这符合开闭原则,即对扩展开放,对修改关闭。
(3)更好的扩展性: 在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
(4)灵活性好: 适配器并没有影响原有功能,如果不想使用,可以直接删除。

然而,适配器模式也存在一些缺点:
(1)增加系统复杂性: 适配器编写过程需要全面考虑,可能会增加系统的复杂性。
(2)降低代码可读性: 过多地使用适配器可能会使系统代码变得凌乱,增加代码阅读难度,降低代码可读性。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,如果系统中有太多这种情况,可能会使系统难以理解和维护。

三、

3.1


总结

未完待续

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部