一般有两种方式可以实现给一个类或对象增加行为:
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。
装饰模式包含如下角色:
#include <iostream> #include "ConcreteComponent.h" #include "ConcreteDecoratorA.h" #include "ConcreteDecoratorB.h" #include "Component.h" using namespace std; int main(int argc, char *argv[]) { ConcreteComponent * pRealProd = new ConcreteComponent(); //��̬������Ϊ Component * pA = new ConcreteDecoratorA(pRealProd); pA->operation(); //������̬������Ϊ Component * pB = new ConcreteDecoratorB(pA); pB->operation(); delete pRealProd; delete pA; delete pB; return 0; }
/////////////////////////////////////////////////////////// // ConcreteComponent.cpp // Implementation of the Class ConcreteComponent // Created on: 03-十月-2014 18:53:00 // Original author: colin /////////////////////////////////////////////////////////// #include "ConcreteComponent.h" #include <iostream> using namespace std; ConcreteComponent::ConcreteComponent(){ } ConcreteComponent::~ConcreteComponent(){ } void ConcreteComponent::operation(){ cout << "ConcreteComponent's normal operation!" << endl; }
/////////////////////////////////////////////////////////// // ConcreteDecoratorA.h // Implementation of the Class ConcreteDecoratorA // Created on: 03-十月-2014 18:53:00 // Original author: colin /////////////////////////////////////////////////////////// #if !defined(EA_6786B68E_DCE4_44c4_B26D_812F0B3C0382__INCLUDED_) #define EA_6786B68E_DCE4_44c4_B26D_812F0B3C0382__INCLUDED_ #include "Decorator.h" #include "Component.h" class ConcreteDecoratorA : public Decorator { public: ConcreteDecoratorA(Component* pcmp); virtual ~ConcreteDecoratorA(); void addBehavior(); virtual void operation(); }; #endif // !defined(EA_6786B68E_DCE4_44c4_B26D_812F0B3C0382__INCLUDED_)
/////////////////////////////////////////////////////////// // ConcreteDecoratorA.cpp // Implementation of the Class ConcreteDecoratorA // Created on: 03-十月-2014 18:53:00 // Original author: colin /////////////////////////////////////////////////////////// #include "ConcreteDecoratorA.h" #include <iostream> using namespace std; ConcreteDecoratorA::ConcreteDecoratorA(Component* pcmp) :Decorator(pcmp) { } ConcreteDecoratorA::~ConcreteDecoratorA(){ } void ConcreteDecoratorA::addBehavior(){ cout << "addBehavior AAAA" << endl; } void ConcreteDecoratorA::operation(){ Decorator::operation(); addBehavior(); }
运行结果:
实例:变形金刚
变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。
装饰模式的优点:
装饰模式的缺点:
在以下情况下可以使用装饰模式:
装饰模式的简化-需要注意的问题:
- 尽量保持具体构件类Component作为一个“轻”类,也就是说不要把太多的逻辑和状态放在具体构件类中,可以通过装饰类 对其进行扩展。 - 如果只有一个具体构件类而没有抽象构件类,那么抽象装饰类可以作为具体构件类的直接子类。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8