您的位置:首页 > 编程语言

设计模式简单代码之Decorator模式(小孩吃饭篇)

2006-07-04 18:39 381 查看
/**********************************************************************************************************/
* 作者:一雨田(http://blog.csdn.net/dylgsy/)。本文可随便转贴,但请保留此信息
*
* Decorator模式:
* 动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类
* 更为灵活。
* 由于Decorator模式仅从外部改变组件,因此组件无需对它的装饰有任何了解;也就是说,
* 这些装饰对该组件是透明的。
/**********************************************************************************************************/

/**********************************************************************************************************/
* 实例:
* 小孩子吃饭,经常会闹别扭,在吃饭的前后可能会要求这要求那的(很难搞),
* 所以针对小孩吃饭时这个特别的需求,我们使用Decorator模式来适应这个变化
/**********************************************************************************************************/

请先看 UML 示意图:



// 好了,下面看看完整的示例代码吧:

#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原则,这样的话就不怕小孩子闹别扭了,呵呵
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: