装饰器模式是一种结构型设计模式,它提供了一种替代继承关系的方法。装饰器模式通过新定义类,并让这个类包含要装饰的对象类,同时添加新定义的附加功能在这个定义类中,也就是说,实际对象被包装在装饰器类的实例中。装饰器类实现了与实际对象相同的接口,并且可以添加额外的行为。
装饰器模式在不改变原有类结构的基础上,灵活动态地在原有类基础上扩展新的功能。可以按照需要选择、按顺序使用不同的装饰者来包装对象,从而达到组合各种功能的目的。装饰器模式实现了功能的扩展和复用,同时也避免了使用继承带来的静态特性和多个子类的维护问题。
使用装饰器的意义
功能扩展,可以动态的给一个对象添加一些额外的功能。
对比通过子类继承的方式,如果后续继续增加功能的话,便要继续继承现有的类,如此就会使继承的层次越来越深,不利于代码的维护和可读性。
降低代码之间的耦合性,提高了灵活性和扩展性。
实现步骤
抽象组件类---抽象被装饰者的行为
一个或多个具体组件类---被装饰者的行为具体实现
抽象装饰器类---与抽象组件一致接口
具体的装饰器类---为具体组件附加功能
代码示例
//抽象组件
class Component
{
public:
virtual void Operation() = 0;
};
//具体组件
class ConcreteComponent : public Component
{
public:
void Operation()
{
cout<<"ConcreteComponent"<<endl;
}
};
//抽象装饰器
class Decorator : public Component
{
public:
Decorator(Component *pComponent) : m_pComponent(pComponent) {}
void Operation()
{
if (m_pComponent!= NULL)
{
m_pComponent->Operation();
}
}
protected:
Component *m_pComponent;
};
//具体装饰器A
class ConcreteDecoratorA : public Decorator
{
public:
ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
void Operation()
{
AddedBehavior();
Decorator::Operation();
}
void AddedBehavior()
{
cout<<"Added behaviorA."<<endl;
}
};
//具体装饰器B
class ConcreteDecoratorB : public Decorator
{
public:
ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
void Operation()
{
AddedBehavior();
Decorator::Operation();
}
void AddedBehavior()
{
cout<<"Added behaviorB."<<endl;
}
};
//main函数
int main()
{
Component* component = new ConcreteComponent();
Decorator* decorateA = new ConcreteDecoratorA(component);
Decorator* decorateB = new ConcreteDecoratorB(decorateA);
decorateB->Operation();
delete decorateB;
delete decorateA;
delete component;
return 0;
}