装饰模式
定义:
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
适用性:
1、 在不影响其他对象的情况下,以动态,透明的方式给单个对象添加职责。
2、 处理那些可以撤销的职责
3、 当不能采用生成子类的方法扩充是。
优点:
1、 比静态继承更灵活
2、 避免在层次结构高层的类有太多的特征
结构:

实现:
class Component
{
public:
Component(){};
virtual~Component(){};
virtual void doSomething() = 0;
};
class A:public Component
{
public:
voiddoSomething(){}
protected:
private:
};
class ConcreteComponent:public Component
{
public:
ConcreteComponent(){}
~ConcreteComponent(){}
voiddoSomething()
{
cout<<"ConcreteComponent doSomething"<
}
};
class Decorator:public Component
{
public:
Decorator(Component*pcomponent):m_pComponent(pcomponent)
{ }
~Decorator(){}
//直接调用被装饰组件
voiddoSomething()
{
m_pComponent->doSomething();
}
private:
Component *m_pComponent;
};
//给ConcreteComponent添加了额外的状态
class ConcreteDecoratorA:public Decorator
{
public:
ConcreteDecoratorA(Component*pcomponent,string name):Decorator(pcomponent),m_name(name)
{ }
~ConcreteDecoratorA(){}
voiddoSomething()
{
cout<<"ConcreteComponent name :"<
Decorator::doSomething();
}
private:
//额外的状态
string m_name;
};
//给ConcreteComponent添加了额外的操作
class ConcreteDecoratorB:public Decorator
{
public:
ConcreteDecoratorB(Component*pcomponent):Decorator(pcomponent)
{ }
~ConcreteDecoratorB(){}
voiddoSomething()
{
doAdditionalThing();
Decorator::doSomething();
}
private:
//额外的职责
voiddoAdditionalThing()
{
cout<<"ConcreteDecoratorB doAdditionalThing "<
}
};
Component *pcom = new ConcreteComponent;
Decorator *pa = newConcreteDecoratorA(pcom,"componentA");
Decorator *pb = newConcreteDecoratorB(pcom);
pa->doSomething();
pb->doSomething();
实现中最重要的一点就是,装饰对象和被装饰的组件的接口是一致的。如果有多个装饰类,则所有的装饰类必须有一个公共的父类。
