• 设计模式--装饰模式Decorate(结构型)


    一、装饰模式

    动态地给一个对象添加额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。

    二、UML图

    1.Component(概念中提到的对象接口),也就是“被装饰者”。
    2.ConcreateComponent(未添加任何职责的,对象接口的子类)。
    3.Decorator(装饰者抽象类),扩张了对象接口的功能。
    4.ConcreteDrcorator(具体装饰类),具体怎么装饰对象接口的在这些类里面反映。

    三、例子

    比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。

    //公共抽象类
    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 *iphone = new NokiaPhone("6300");
        Phone *dpa = new DecoratorPhoneA(iphone); //装饰,增加挂件
        Phone *dpb = new DecoratorPhoneB(dpa);    //装饰,屏幕贴膜
        dpb->ShowDecorate();
        delete dpa;
        delete dpb;
        delete iphone;
        return 0;
    }

    四、使用场景

    装饰模式一般为已有组件动态添加更多的功能。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。装饰模式提供了一种“即用即付”的方法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用装饰类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。

    参考:

    http://blog.csdn.net/wuzhekai1985/article/details/6672614

    http://zy19982004.iteye.com/blog/1407978

  • 相关阅读:
    django框架进阶ModelForm组件长期维护
    crm项目stark组件
    前端html长期维护
    django框架进阶AJAX长期维护
    22python语法基础基础赋值与深浅拷贝
    django框架基础路由系统长期维护
    django框架基础ORM单表操作长期维护
    24python语法基础基础控制语句
    django框架基础ORM基础长期维护
    django框架基础ORM进阶长期维护
  • 原文地址:https://www.cnblogs.com/justkong/p/6235703.html
Copyright © 2020-2023  润新知