* 作者:一雨田(http://blog.csdn.net/dylgsy/)。本文可随便转贴,但请保留此信息
*
* Decorator模式:
* 动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类
* 更为灵活。
* 由于Decorator模式仅从外部改变组件,因此组件无需对它的装饰有任何了解;也就是说,
* 这些装饰对该组件是透明的。
/**********************************************************************************************************/
/**********************************************************************************************************/
* 实例:
* 小孩子吃饭,经常会闹别扭,在吃饭的前后可能会要求这要求那的(很难搞),
* 所以针对小孩吃饭时这个特别的需求,我们使用Decorator模式来适应这个变化
/**********************************************************************************************************/
#include <iostream>
using namespace std;
// 定义基本接口类,设计模式的通用手法了
class CChildComponent
{
public:
// 小孩吃饭
virtual void Eat() = 0;
};
class CChild: public CChildComponent
{
public:
virtual void Eat()
{
cout << "我吃饭了。" << endl;
}
};
// 如果小孩想在吃饭前先吃个苹果,加个修饰类,这个类和小孩类派生于相同父类
class CDecorator: public CChildComponent
{
public:
CDecorator(CChildComponent *childCom)
{
_child = childCom;
}
virtual void Eat()
{
}
protected:
CChildComponent *_child;
};
// 具体化修饰类
class CChildDecorator: public CDecorator
{
public:
CChildDecorator(CChildComponent *childCom):CDecorator(childCom)
{
}
virtual void Eat()
{
cout << "我先吃个苹果." << endl;
_child->Eat();
}
};
// 客户程序
void main()
{
// 小孩吃饭
CChild child;
child.Eat();
// 这个时候,小孩要先吃个水果再吃饭
// 所以这个对象的职责增加了
// 客户端的代码变为:
CChildDecorator childDec(&child);
childDec.Eat();
// 可以看到上面的代码好像是把child给包起来了,它根本就不知道有一个包装类对它进行了包装
// 满足了OCP原则,这样的话就不怕小孩子闹别扭了,呵呵
}