zoukankan      html  css  js  c++  java
  • c++ 装饰模式(decorate)

      装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类 更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是, 将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Phone
    {
    public:
        Phone() {}
        virtual ~Phone() {}
        virtual void ShowDecorate() {} 
    };
    
    class iPhone:public Phone
    {
    private:
        string m_name;
    public:
        iPhone(string name):m_name(name){}
        ~iPhone() {}
        void ShowDecorate()
        {
            cout << m_name << "的装饰" <<endl;
        }
    };
    
    class AndroidPhone : public Phone
    {
    private:
        string m_name;
    public:
        AndroidPhone(string name):m_name(name){}
        ~AndroidPhone() {}
        void ShowDecorate()
        {
            cout << m_name << "的装饰" <<endl;
        }
    };
    
    class DecoratorPhone : public Phone
    {
    private:
        Phone *m_phone;
    public:
        DecoratorPhone(Phone *phone):m_phone(phone) {}
        virtual void ShowDecorate()
        {
            m_phone->ShowDecorate();
        }
    };
    
    class DecoratorPhoneA:public DecoratorPhone
    {
    public:
        DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone) {}
        void ShowDecorate() 
        {
            DecoratorPhone::ShowDecorate(); 
            AddDecorate();
        }
    private:
        void AddDecorate()
        {
            cout << "增加挂件" << endl;
        }
    };
    
    int main()
    {
         Phone *dpa = new DecoratorPhoneA(new iPhone("5s"));
         dpa->ShowDecorate();
         delete dpa;
        
         Phone *dpb = new DecoratorPhoneA(new AndroidPhone("Mi2s"));
         dpb->ShowDecorate();
    
         system("pause");
         return 0;
    }

    输出结果:

    5s的装饰
    增加挂件
    Mi2s的装饰
    增加挂件
    请按任意键继续. . .
  • 相关阅读:
    飞鸽传书中文源码
    nohup命令参考
    Linux平台编程新手入门 C语言中的移位操作
    小技巧:让linux程序在后台运行
    2440之中断管理
    linux终端中输出彩色字体(C/SHELL)
    C语言标准中的逻辑位移和算术位移
    SQL2005利用ROW_NUMER实现分页的两种常用方式
    不用现有方法,把string转换成int型[C#]
    C# 如何生成一个时间戳
  • 原文地址:https://www.cnblogs.com/onlycxue/p/3480436.html
Copyright © 2011-2022 走看看