标签:style blog class code java c
装饰模式(Decorater)
动态的给一个对象添加一些额外的职责。 就增加功能来说,装饰模式比生成子类更加灵活。
装饰模式中有几个关键的地方:
①装饰模式依赖于【装饰者】类中有一个父类对象(指针), 而装饰函数(或方法)用来此父类对象(指针)设置实际的动态类型。
②因为是要给某个对象增加职责,所以很明显的,在继承体系中,需要在某虚函数中调用其父类的该虚函数,这样才有层层调用的效果。
下图来源 http://www.cnblogs.com/god_bless_you/archive/2010/06/10/1755212.html
好,下面自己想一个例子,有时候我常想:要是人会非该多好啊!
于是幻想有一天有一个白胡子老爷爷(应该是位老神仙)问我:小伙子,现在给你几个技能,你选择一下,会飞,会隐身,想要钱就来钱,想要美女就来美女。这四个你选一个!
可是选哪个好呢? 会飞? 可以在天上飞啊飞的。 会隐身?那能去女澡堂参观吗?(罪过罪过!!) 想要钱就来钱? 光有钱好还少点什么。 想要美女就来美女? 太多了也吃不消啊!
不如这样吧,都来来试试呗,先尝后买嘛!
于是我想四个技能都试试。
下面代码中只写了【飞】和【隐身】两个技能的代码
超级父类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;
}
标签:style blog class code java c
原文地址:http://www.cnblogs.com/cuish/p/3726868.html