定义:
动态的给一个对象增加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
就是以组合的方式动态的为对象添加功能,比起继承,更符合开闭原则。
结构图:
代码:
//Component类
class Component
{
public:
//抽象核心职责,装饰器需要在这个职责基础上增加新的职责
public void operation();
}
//Component实现类
class ConcreteComponent : Component
{
//核心职责实现
public:
void operation()
{
。。。;
}
}
//装饰器抽象类,需要有一个成员指向组件对象,并含有组件核心职责接口定义
class Decorator : Component
{
protected:
//指向组件对象的成员
ConcreteComponent cConcreteComponent;
public :
//构造方法传入组件对象
Decorator :Decorator (ConcreteComponent cConcreteComponent)
{
this.cConcreteComponent = cConcreteComponent;
}
//j组件核心职责
void operation()
{
cConcreteComponent .operation();
}
]
//具体装饰A
class DecoratorA : Decorator
{
public:
//新增功能
void Addoperation
{
。。。;
}
//组件核心职责
void operation()
{
Addoperation();//增加新职责
this.cConcreteComponent .operation();
}
}
//具体装饰B
class DecoratorB: Decorator
{
public:
//新增功能
void AddBoperation
{
。。。;
}
//j组件核心职责
void operation()
{
AddBoperation();//增加新职责
this.cConcreteComponent .operation();
}
}
//客户端
Component cConcreteComponent = new ConcreteComponent();
DecoratorA cDecoratorA = new DecoratorA (cConcreteComponent );
DecoratorB cDecoratorB = new DecoratorB (cDecoratorA );
cDecoratorB .operation();
使用时机:
当系统需要新增功能,并且新增功能是为了装饰原有核心职责或者主要行为时,考虑装饰器模式。
优点:把类中的装饰功能从类中搬移出去,简化原有的类,并守护开闭原则
缺点:更多的类,使程序更加复杂。