设计模式之装饰模式
装饰器模式(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;
}