适配器模式-C++

#include <iostream>

using namespace std;

class Duck {
public:
    virtual ~Duck() = default;
    virtual void Quack() = 0;
    virtual void Fly() = 0;
};

class Turkey {
public:
    virtual ~Turkey() = default;
    virtual void Gobble() = 0;
    virtual void Fly() = 0;
};

class ConcreteTurkey : public Turkey {
public:
    void Gobble() override { cout << "Turkey Gooble" << endl; }
    void Fly() override { cout << "Turkey Fly." << endl; }
};

class ConcreteDuck : public Duck {
public:
    void Quack() override { cout << "Quack." << endl; }
    void Fly() override { cout << "ConcreteDuck Fly." << endl; }
};

//对象适配器,也即组合方式实现适配
class DuckAdapter : public Duck {
public:
    DuckAdapter(Turkey &turkey) : _turkey(turkey) { }

    void Quack() override { _turkey.Gobble(); }
    void Fly() override { _turkey.Fly(); }

private:
    Turkey &_turkey;
};

//类适配器, 多继承方式, 这里直接继承具体的类,而非接口或抽象类
class DuckAdapterClass : public ConcreteDuck, public ConcreteTurkey {
public:
    void Quack() override { ConcreteTurkey::Gobble(); }
    void Fly() override { ConcreteTurkey::Fly(); }
};

void UseDuck(Duck &duck) {
    duck.Quack();
    duck.Fly();
}

int main() {
    ConcreteTurkey cturkey;
    DuckAdapter duck_adapter(cturkey);
    UseDuck(duck_adapter);

    DuckAdapterClass duck_adapter_class;
    UseDuck(duck_adapter_class);

    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大家好我是作者馒头哥,目前在某网贷投资平台做运营工作,同时也有将近2年的网贷投资经验,在工作之余也喜欢写一些关于行...
    洛小白阅读 2,701评论 0 3
  • 这些带血的数字背后 是14年间中华民族的深重苦难 耻辱血泪哀痛 那是值得亿万中国人永远铭记的一天 72年前的今天—...
    阿chen先生阅读 2,738评论 0 1
  • 也许是你不知道 也许你假装不明白 我一直都是喜欢你的 每次看到好玩东西就会想要和你分享 为了给你吃的分给周围所有人...
    执剑吟游的诗人阅读 3,161评论 0 0
  • 前两天说到小说的事情,其实我从小到大读过的小说真是不计其数,尤其是接触了互联网后,更是天高任鸟飞。武侠小说陪我走完...
    秉笔春秋吕书生阅读 2,286评论 6 7
  • 每年田野里发出的花 像大花猫蓬松的尾巴 那年的雪花 晶亮的 仿佛要在阳光下发芽 没吵闹声的冷秋早晨 重复着我偷看你...
    撸串儿评论员阅读 1,716评论 2 1