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

来源:互联网 发布:三菱plc中文编程手册 编辑:程序博客网 时间:2024/04/27 16:34

/**********************************************************************************************************/
* 作者:一雨田(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原则,这样的话就不怕小孩子闹别扭了,呵呵
}

原创粉丝点击