设计模式:6. 适配器模式

还记得介绍“策略模式”时我们介绍的案例吗?现在游戏中不仅要有鸭子,还要增加火鸡。为了不做太多的改变,我们想让火鸡能够适配鸭子的接口。
之前鸭子的接口如下:

class Duck
{
public:
  virtual void quack() = 0;
  virtual void fly() = 0;
};

而我们的新角色,火鸡的接口是这样的:

class Turkey
{
public:
  virtual void gobble() = 0;
  virtual void fly() = 0; //可以飞,但飞的不远
};

那我们写个适配器吧,让火鸡也能够顺利的接入我们的游戏。

class TurkeyAdapter: public Duck
{
public:
  TurkeyAdapter(Turkey* turkey): m_turkey(turkey) {}
  void quack() override
  {
    m_turkey->gobble();
  }
  void fly() override
  {
    for (int i=0; i<5; ++i)
    {
      m_turkey->fly();
    }
  }
private:
  Turkey* m_turkey;
};

这样,新加入的火鸡可以完全融入这个游戏中了。

int main()
{
  MallardDuck* duck = new MallardDuck; // 具体的鸭子
  WildTurkey* turkey = new WildTurkey; // 具体的火鸡
  Duck* turkeyAdapter = new TurkeyAdapter(turkey);
  
  testDuck(duck);
  testDuck(turkeyAdapter);
  return 0;
}

void testDuck(Duck *duck)
{
  duck->quack();
  duck->fly();
}

适配器模式除了上方演示的对象适配器,还有类适配器,类适配器需要编程语言支持多重继承。类适配器通过多重继承同时继承目标接口(Duck)和被适配者(Turkey),从而在适配器内部直接调用被适配者的方法,无需像对象适配器那样额外持有一个指针成员变量。由于篇幅有限,不做介绍。
给出适配器定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

posted @ 2026-06-19 15:35  初五二十一  阅读(4)  评论(0)    收藏  举报