当前位置: 首页 > article >正文

【HeadFirst 设计模式】适配器模式的C++实现

一、案例背景

可曾记得之前写过的鸭子游戏?在那个案例中,我们设计了一个抽象鸭子类以及绿头鸭,红头鸭,橡皮鸭等子类,假设现在要进行一场动物表演,需要四种鸭子在台上表演他们的技能:呱呱叫和飞翔,但是如你所见,我们现在只有三种鸭子:绿头鸭,红头鸭和橡皮鸭。正当你愁眉不展的时候,一只野生的火鸡出现在你的面前!现在,让我们想办法将这只火鸡“伪装”成鸭子来完成我们的任务吧!

二、案例分析

火鸡也会叫,但是它的叫声和鸭子不同,它并不能呱呱叫,而只能咕咕叫;它也会飞,但是由于体型过大,飞行距离一次却只有鸭子的五分之一;如何给这只火鸡乔装打扮骗过台下的观众呢?
这时,我们可以设计一个适配器类:该类继承自鸭子接口(因为这个类的作用就是将伙计变成鸭子),它的构造器接受一个待伪装者:即一个火鸡类的指针,由于继承了鸭子接口,它需要实现鸭子的quark和fly方法,为了实现伪装,不妨在quark方法中调用火鸡的咕咕叫方法,同理由于火鸡飞一次的距离只有鸭子的五分之一,那么在fly方法中可以让火鸡飞五次,通过这种方式实现伪装。

三、代码分析

#include <iostream>

using namespace std;

//鸭子抽象类
class Duck{
    public:
    virtual void quack() = 0;
    virtual void fly() = 0;
};

//绿头鸭子类
class MallardDuck: public Duck{
    public:
    void quack() override{
        cout<<"gua gua~~"<<endl;
    }
    void fly() override{
        cout<<"I'm flying~"<<endl;
    }
};

//火鸡
class Turkey{
    public:
    //火鸡不会呱呱叫,只会咕咕叫
    virtual void gobble() = 0;
    //火鸡会飞,但是飞不远
    virtual void fly() = 0;
};

//野生火鸡
class WildTurkey : public Turkey{
    public:
    void gobble() override{
        cout<<"Gobble gobble~"<<endl;
    }

    void fly() override{
        cout<<"I'm flying a short distance~"<<endl;
    }
};

//假设我们现在需要将伙计伪装成鸭子
class Adapter: public Duck{
    Turkey* turkey;
    public:
    Adapter(Turkey* turkey){
        this->turkey = turkey;
    }
    void quack() override{
        turkey->gobble();
    }
    void fly() override{
        //火鸡会飞,但是飞不远,假设一次鸭子飞行的距离等于五次火鸡飞行的距离
        for(int i = 0; i<5;i++){
            turkey->fly();
        }
    }
};


int main(){
    Duck* duck = new MallardDuck();
    Turkey* tuekey = new WildTurkey();

    duck->quack();
    duck->fly();

    cout<<"---------"<<endl;

    Adapter* adapter = new Adapter(tuekey);
    adapter->quack();
    adapter->fly();


    delete duck;
    delete tuekey;

    return 0;
};

http://www.kler.cn/news/360134.html

相关文章:

  • XS2123--------IEEE 802.3af 兼容的 PD 和 DC/DC 控制器集成功率 MOSFET V2.0
  • 找不到包的老版本???scikit-learn,numpy,scipy等等!!
  • 【Golang】Go语言web框架Gin响应客户端有哪些方式
  • C++详细笔记(四)
  • 每日OJ题_牛客_集合_排序_C++_Java
  • stable diffusion WEBUI Brief summary
  • 家政小程序搭建,数字化市场发展下的意义
  • RK3588开发笔记-麦克风阵列多pdm通道合并成一个声卡
  • 智能新势力:防爆挂轨巡检机器人助力化工安全
  • 外包干了2个月,技术明显退步
  • Java八股整合(Kafka+RocketMQ+K8S)
  • Redis入门:在Java程序中高效使用Redis
  • 4.流程控制及函数
  • 代码随想录算法训练营第二十二天 | 回溯理论基础 77.组合 216.组合总和Ⅲ 17.电话号码的字母组合
  • nginx精讲
  • CORS预检请求配置流程图 srpingboot和uniapp
  • 如何获得淘宝/天猫淘宝商品详情 API接口
  • jmeter响应断言放进csv文件遇到的问题
  • MySQL索引、事物与存储引擎
  • SpringCloud学习记录|day6