设计模式之装饰模式

装饰器模式(Decorator Pattern)

允许向一个现有对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

意图

动态的给一个对象添加额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

解决问题

一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

如何解决

将具体功能职责划分,同时继承装饰器模式

优点

装饰类和被装饰类可以独立发展,不会互相耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点

多层装饰比较复杂

注意事项

可代替继承

//装饰器模式

class Phone
{
public :
    Phone()
    {}
    virtual ~Phone()
    {}
    virtual void showDecorate()
    {}
};
class iPhone  : public Phone  //具体手机类
{
private:
    string name;
public:
    iPhone(string _name)
        :name(_name)
    {}
    ~iPhone()
    {}
    void showDecorate()
    {
        cout << name<<"的装饰"<< endl;
    }
};
class NokiaPhone : public  Phone
{
private:
    string name;
public :
    NokiaPhone(string _name)
        :name(_name)
    {}
    ~NokiaPhone()
    {}
    void  showDecorate()
    {
        cout << name <<"的装饰"<< endl;
    }
};

class DecoratorPhone :public Phone
{
private :
    Phone* m_phone; //要装饰的手机
public:
    DecoratorPhone(Phone *phone)
        :m_phone(phone)
    {}
    virtual void showDecorate()
    {
        m_phone->showDecorate();
    }
};

class DecoratePhoneA : public DecoratorPhone //具体的装饰A
{
public :
    DecoratePhoneA(Phone* ph)
        :DecoratorPhone(ph)
    {}
    void showDecorate()
    {
        DecoratorPhone::showDecorate();
        AddDecorate();
    }
private:
    void AddDecorate()
    {
        cout <<"增加挂件" << endl;
    }
};
class DecoratePhoneB : public DecoratorPhone
{
public:
    DecoratePhoneB(Phone* ph)
        :DecoratorPhone(ph)
    {}
    void showDecorate()
    {
        DecoratorPhone::showDecorate();
        AddDecorate();
    }
private:
    void  AddDecorate()
    {
        cout << "屏幕贴膜"<< endl;
    }
};
int test_Decorate()  //装饰器模式
{
    Phone* ph = new NokiaPhone("16300");
    Phone *dpa = new DecoratePhoneA(ph);//增加挂件
    Phone* dpb = new DecoratePhoneB(ph);//增加贴膜
    ph->showDecorate();

    delete ph;
    delete dpa;
    delete dpb;
    system("pause");
    return 0;

}
装饰模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。装饰模式提供了一种“即用即付”的方法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用装饰类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。[DP]
在本文的例子中,我们定义了两个具体的手机类,iPhone类和NokiaPhone类,通过单独的装饰类为它们添加特性,从而组合出复杂的功能。