参考书籍 : 大话设计模式
遇到设计模式,首先想到的是将变化的部分和不变化的部分 分开!
ok!今天要做的是描述小明出现在各种活动场景中。
那么小明是不是需要更换不同的服饰了,比如婚礼,比如考试,比如游泳等等。
从上面的分析可以看到在各种活动场景中,小明变化的只是服饰,小明本人是没有任何变化的。
而且服饰的变化也是有顺序的,比如先穿内衣,才能再穿外衣,当然除非是超人,可以内裤外穿。
那么我们怎么来隔离这种变化和不变化的部分呢? 这就是书上的装饰模式了。
代码源自网络:
#include <string>
#include <iostream>
using namespace std;
//人
class Person
{
private:
string m_strName;
public:
Person(string strName)
{
m_strName=strName;
}
Person(){}
virtual void Show()
{
cout<<"装扮的是:"<<m_strName<<endl;
}
};
//装饰类
class Finery :public Person
{
protected:
Person* m_component;
public:
void Decorate(Person* component)
{
m_component=component;
}
virtual void Show()
{
m_component->Show();
}
};
//T恤
class TShirts: public Finery
{
public:
virtual void Show()
{
cout<<"T Shirts"<<endl;
m_component->Show();
}
};
//裤子
class BigTrouser :public Finery
{
public:
virtual void Show()
{
cout<<" Big Trouser"<<endl;
m_component->Show();
}
};
//客户端
int main()
{
Person *p=new Person("小李");
BigTrouser *bt=new BigTrouser();
TShirts *ts=new TShirts();
bt->Decorate(p);
ts->Decorate(bt);
ts->Show();
return 0;
}
可以看到给小明先穿了裤子,再穿了T恤, 不论接着再穿什么,都不会对现有的代码造成变动。
在上面的代码中,将变动的服饰进行了封装,在虚函数show的面要特别注意m_component->Show()的调用。
这里虽然对服饰变化的封装不是很明显, 但是动态的增减衣服,对现有的结构没有造成变动,这个就是很好的隔离作用了。
我们使用设计模式,就是为了能够动态的描述现实生活!
总结: 第一篇的工厂模式,就是我们去商店买东西的活动,这篇的装饰模式,就是我们平时的穿衣服的活动,是不是都很形象呢?