【设计模式】装饰模式

 

装饰模式(Decorater)

动态的给一个对象添加一些额外的职责。 就增加功能来说,装饰模式比生成子类更加灵活。

 

装饰模式中有几个关键的地方:

①装饰模式依赖于【装饰者】类中有一个父类对象(指针), 而装饰函数(或方法)用来此父类对象(指针)设置实际的动态类型。

②因为是要给某个对象增加职责,所以很明显的,在继承体系中,需要在某虚函数中调用其父类的该虚函数,这样才有层层调用的效果。

下图来源 http://www.cnblogs.com/god_bless_you/archive/2010/06/10/1755212.html

 

【设计模式】装饰模式_第1张图片

 

好,下面自己想一个例子,有时候我常想:要是人会非该多好啊!

于是幻想有一天有一个白胡子老爷爷(应该是位老神仙)问我:小伙子,现在给你几个技能,你选择一下,会飞会隐身想要钱就来钱想要美女就来美女。这四个你选一个!

可是选哪个好呢?  会飞? 可以在天上飞啊飞的。 会隐身?那能去女澡堂参观吗?(罪过罪过!!) 想要钱就来钱? 光有钱好还少点什么。 想要美女就来美女? 太多了也吃不消啊!

不如这样吧,都来来试试呗,先尝后买嘛!

于是我想四个技能都试试。

 

下面代码中只写了【飞】和【隐身】两个技能的代码

 

超级父类Person类

#include "stdafx.h" #include <iostream> #include <string>
using namespace std; /************************************************************************ 设计模式3 装饰模式 用来为某个对象动态的增加操作 这里有两个操作,一个是【飞】,一个是【隐身】 有一个装饰者类【技能】类,通过【技能】类设置(装饰函数)Person类指针的动态 类型,每个继承层次改写Show虚函数,然后两个【飞】【隐身】子类在该Show虚函数 内部调用其父类【技能】类的虚函数,达到层层包装的作用。 ************************************************************************/
class Person { public: Person(string strName); virtual void Show(); protected: string m_strName; }; Person::Person(string strName) { m_strName = strName; } void Person::Show() { cout << "\r\n I am "<<m_strName<<", 我就是我,是颜色不一样的烟火 !"<<endl; }

 

 

【技能】类(装饰者类)

//【技能】类, 装饰器类
class Behavier : public Person { protected: Person* m_pPerson; public: Behavier(string strName); virtual void Show(); virtual void Decorater(Person* pPerson); //装饰函数
}; Behavier::Behavier(string strName) : Person(strName){} void Behavier::Show() { if (NULL != m_pPerson) m_pPerson->Show(); } void Behavier::Decorater(Person* pPerson) { m_pPerson = pPerson; }

 

 

 

 【飞】类

//【飞】类
class Fly : public Behavier { public: Fly(string strName); virtual void Show(); }; Fly::Fly(string strName) : Behavier(strName){} void Fly::Show() { cout << "\r\n 我会飞啊 哈哈!\r\n"; Behavier::Show(); }

 

 

 【隐身】类

//【隐身】类
class Hidden : public Behavier { public: Hidden(string strName); virtual void Show(); }; Hidden::Hidden(string strName) : Behavier(strName){} void Hidden::Show() { cout << "\r\n 我会隐身!\r\n"; Behavier::Show(); }

 

 

 

main函数以及执行结果

int _tmain(int argc, _TCHAR* argv[]) { //客户端不会出现【技能】类(装饰者类)
    Person *pPerson = new Person("cuish"); Fly *pFly = new Fly("cuish1"); Hidden *pHidden = new Hidden("cuish2"); pFly->Decorater(pPerson); pHidden->Decorater(pFly); pHidden->Show(); cout << endl <<endl; delete pPerson; delete pFly; delete pHidden; return 0; }

 

 

 【设计模式】装饰模式_第2张图片

 

 

 

 

 

  

 

 

你可能感兴趣的:(设计模式)