装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。动态是手段,组合才是目的。
Component:定义一个对象接口,可以给这些对象动态地添加职责;
ConcreteComponent:定义一个具体的Component,继承自ConcreateComponent,重写了Component类的虚函数;
Decorator:维持一个指向Component对象的指针,该指针指向需要被装饰的对象;并定义一个与Component接口一致的接口;
ConcreteDecorator:向组件添加职责。
#include <iostream>
using namespace std;
class component {
public:
virtual void operation() = 0;
};
/*
* 主功能类
*/
class ConcreteComponent : public component {
public:
void operation()
{
cout << "ComncreteConpeonent's operation" << endl;
}
};
/*
* 装饰主类(辅助功能主类)
*/
class Decorator : public component {
private:
component * pc;
public:
Decorator( component *t )
{
pc = t;
}
void operation()
{
}
void inter()
{
pc->operation();
}
};
/*
* 辅助A功能类
*/
class concreteDecoratorA : public Decorator {
private:
public:
concreteDecoratorA( component *t ) : Decorator( t )
{
}
void operation()
{
inter();
cout << "concreteDecoratorA's operator" << endl;
}
};
/*
* 辅助B功能类
*/
class concreteDecoratorB : public Decorator {
private:
public:
concreteDecoratorB( component *t ) : Decorator( t )
{
}
void operation()
{
inter();
cout << "concreteDecoratorB's operator" << endl;
}
};
int main( void )
{
component * pa = new ConcreteComponent();
component * pb = new concreteDecoratorA( pa );
component * pc = new concreteDecoratorB( pb );
pc->operation();
return(0);
}