zoukankan      html  css  js  c++  java
  • 结构模式->装饰模式

          Decorator  Pattern 把类中装饰功能从类中搬移去除,这样简化原来类 。建立一个新类来处理这些装饰功能。

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

            在这种设计中,手机的装饰功能被独立出来,可以单独发展,进而简化了具体手机类的设计。下面给出Phone类的实现:

    //公共抽象类  
    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 NokiaPhone : public Phone  
    {  
    private:  
        string m_name;  
    public:  
        NokiaPhone(string name): m_name(name){}  
        ~NokiaPhone() {}  
        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; } //增加的装饰  
    };  
    //具体的装饰类  
    class DecoratorPhoneB : public DecoratorPhone  
    {  
    public:  
        DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}  
        void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }  
    private:  
        void AddDecorate() { cout<<"屏幕贴膜"<<endl; } //增加的装饰  
    };  

    客户使用方式:

    int main()  
    {  
        Phone *phone = new NokiaPhone("6300");  
        Phone *dpa = new DecoratorPhoneA(phone); //装饰,增加挂件  
        Phone *dpb = new DecoratorPhoneB(phone); //装饰,屏幕贴膜  
        dpb->ShowDecorate();  
        delete dpa;  
        delete dpb;  
        delete iphone;  
        return 0;  
    }  

          装饰模式 为已有的功能动态的添加一些更多的功能。 当系统需要新功能时候。在旧版代码中添加不重要的新功能违背了开闭原则。经常用一个新类来处理我们的新功能的添加。 新类包含所要修饰的对象。  有效的把类的核心职责跟装饰功能区分开。

     

    关注公众号 海量干货等你
  • 相关阅读:
    Oracle 口令文件:即 oracle密码文件
    Oracle_plsql_开发工具搭建最小化客户端
    Oracle 网络监听配置管理
    Oracle12c 从入门到精通(第二版) 闫红岩 金松河 编著
    手工建库
    Oracle管理文件OMF (oracle managed files)
    逻辑存储结构
    Oracle管理文件OMF (oracle managed files)
    PowerDesigner连接Oracle并导出表结构
    win 系统设置weblogic 进行定时自动重启并删除其日志和缓存文件,定时监控cpu是否达到100%并重启weblogic服务
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734424.html
Copyright © 2011-2022 走看看