设计模式简单代码之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原则,这样的话就不怕小孩子闹别扭了,呵呵
}
* 作者:一雨田(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原则,这样的话就不怕小孩子闹别扭了,呵呵
}
相关文章推荐
- 设计模式简单代码之Decorator模式(小孩吃饭篇)
- 设计模式简单代码之Chain Of Responsibility 模式(小孩要苹果篇)
- 简单Java代码实例助你通俗易懂的理解什么是装饰(者)设计模式 (Decorator)
- 设计模式简单代码之Chain Of Responsibility 模式(小孩要苹果篇)
- 设计模式简单代码之Mediator模式(二)
- 设计模式简单代码之Mediator模式
- 设计模式简单代码之Facade模式(编译系统篇)
- 设计模式之装饰(Decorator)模式 代码详解
- 设计模式简单代码之Flyweight模式(二)
- 适配器设计模式,简单的Java代码模拟
- 设计模式简单代码之Flyweight模式
- 23种设计模式及简单代码
- 设计模式简单代码之Command模式(皇帝圣旨篇)
- 设计模式简单代码之Proxy模式(买房子篇)
- 设计模式简单代码之Mediator模式(一)
- PHP简单工厂设计模式,简单代码。(缺点请指正,互相学习)
- 设计模式简单代码之一
- 设计模式简单代码之Facade模式(编译系统篇)
- 设计模式简单代码之Command模式(皇帝圣旨篇)
- 简单了解设计模式中的装饰者模式及C++版代码实现