装饰者模式
在OO设计和开发过程,当我们需要为一个已经定义好的类添加新的职责(操作),通常情况下我们会采用继承的方式定义好自己的类,但是采取这样的方式会带来一些问题。
为了多态,通过父类指针指向其具体子类,但是这会造成另一问题:当我们需要为子类添加新的职责,就必须向其父类添加一个这个功能的抽象接口,否则通过父类指针无法调用这个方法了。这样处于高层的父类就含有太多的的方法,并且继承自这个父类的所有子类都不可避免继承了父类的这些接口,但是这些可能并不是所有子类所需要的。
为此我们采用组合的方式而不是继承方式,当需要添加一个操作的时候就可以通过Decorator模式来解决。装饰模式通过一个包装对象,以对客户端透明的方式动态地给一个对象附加上更多的责任。
装饰者模式的角色:
抽象构件角色(Component):给出一个抽象接口,以规范准备接受附加责任的对象.
具体构件角色(Concrete Component):定义将要接受附加责任的类.
装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象接口一致的接口.
具体装饰角色(Concrete Decorator):负责给构件对象添加附加的责任.
装饰者模式典型结构图:
装饰者模式的程序实例:
#include <iostream> #include <string> using namespace std; //抽象构件 class Component{ public: Component(){}; ~virtual Component(){}; virtual void doSomething()=0; }; //具体构件 class ConcreteComponentA:public Component{ public: ConcreteComponentA(){} ~ConcreteComponentA(){} void doSomething(){ cout<<"功能A"<<endl; } };
class ConcreteComponentB:public Component{ public: ConcreteComponentB(){} ~ConcreteComponentB(){} void doSomething(){ cout<<"功能B"<<endl; } };
//装饰者角色 class Decorator:public Component{
public:
Decorator(Component* com){ _com=com; }
~Decorator(){ delete _com; }
void doSomething(){
_com->doSomething();
} }; //具体装饰者角色 class ConcreteDecorator:public Decorator{ public: ConcreteDecorator(Component* com):Decorator(com){} ~ConcreteDecorator(); void doSomething(){ Decorator::doSomething(); doAnotherthing(); } private: void doAnotherthing(){ cout<<"功能C"<<endl; } };
采用这样的方式我们可以通过ConcreteDecorator的构造函数来确定传递某个具体的ConcreteComponent类.
例如此例:
ConcreteDecorator* pA=new ConcreteDecorator(new ConcreteComponentA()) 或者
new ConcreteComponentB();
通过这种方式只要是Component型别的对象都可以提供修饰操作的类,这样就算我们新建了100个Component型别的类ConcreteComponent,也都可以由Decorator一个类搞定.而这也正是Decorator模式的关键所在.