C++设计模式--适配器与外观模式解析(head first 设计模式C++实现)

适配器模式与外观模式

  1. 适配器模式:将一个类的接口,转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间。
  2. 客户使用适配器的过程如下:
    • 客户通过目标接口调用适配器的方法对适配器发出请求
    • 适配器使用是陪着接口把请求转换成被适配者的一个或度过调用接口
    • 客户接收刀调用的结果,但并未察觉这一切是适配器在转换作用
  3. 外观模式:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
  4. 外观模式没有封装子系统的类,只是提供简化的接口。
  5. 外观模式体现的设计原则:最少知识原则:只和你的密友谈话。
  6. 当需要使用一个现有的类而其它接口并不复合你的需要时,就使用适配器。
  7. 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式。(外观将客户从一个复杂是子系统中解耦)

模式意图
装饰者将一个接口转成另外一个接口
适配器不改变接口,但加入责任
外观让接口更简单

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-65xbKiw7-1663215959140)(img/adapter.png)]


class Duck{

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

class MallerDuck :public Duck{

    public:
        virtual void quack(){
            cout<<" Quack"<<endl; 
        }
        virtual void fly(){
            cout<<" i am flying"<<endl;
        }

};

class Turkey{
    public:
        virtual ~Turkey(){};
        virtual void gobble()=0;
        virtual void fly()=0; 
};

class  WildTurkey:public Turkey{
    public:
        virtual void gobble(){
            cout<<" Globble gobble"<<endl;
        };
        virtual void fly(){
            cout<<"i am flying a short distance "<<endl;
        }; 

};

class Turkey2Duck:public Duck{
    private:
        Turkey *m_turkey=nullptr;
    public:
        Turkey2Duck(Turkey* turkey):m_turkey(turkey){
            
        }
        virtual void quack(){
            m_turkey->gobble();
        }
        virtual void fly(){
            for(int i=0;i<5;++i)
                m_turkey->fly();
        }
        ~Turkey2Duck(){
            if(m_turkey!=nullptr){
                delete m_turkey;
                m_turkey=nullptr;
            }
        }
};

int main(){

    Turkey* turkey=new WildTurkey;
    Duck* duck = new MallerDuck;

    turkey->fly();
    turkey->gobble();

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

    Duck* turkey2duck = new Turkey2Duck(turkey);

    turkey2duck->quack();
    turkey2duck->fly();


    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值