您的位置:首页 > 其它

设计模式学习--装饰模式

2017-03-07 23:08 246 查看
  看完了几个原则后,我又开始看装饰模式,将一些装饰用的方法从主类中分离,并且将具体的装饰步骤隔离开了,使得主类更加的简便。



  这样做的最大好处就是,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。

#include <iostream>
#include <string>

using namespace std;

class People										//主类
{
string m_name;

public:
People(){};
People(string name):m_name(name){};
virtual	void show()								//输出人名的虚函数
{
cout<<"装扮的"<<m_name<<endl;
}
};

class Clothes : public People						//装饰类
{
People* m_peo;
public:
void decorate(People* peo)						//传入对象指针
{
m_peo = peo;
}
void show()
{
if(m_peo != NULL)							//当传入的对象指针不为空时 调用m_peo的show函数
{
m_peo->show();
}
}
};

class Tshirts : public Clothes						//具体的装饰类  T恤
{
public:
void show()
{
cout<<"大T恤 ";								//输出大T恤
Clothes::show(); 							//调用基类的show函数  输出人名	用域解析符 防止造成命名冲突
}
};

class Shoes : public Clothes						//具体的装饰类 鞋子
{
public:
void show()
{
cout<<"跑鞋 ";								//输出跑鞋
Clothes::show();							//调用基类的show函数  输出人名
}
};

class Jeans : public Clothes						//具体的装饰类 牛仔裤
{
public:
void show()
{
cout<<"牛仔裤 ";							//输出牛仔裤
Clothes::show();							//调用基类的show函数  输出人名
}
};

class BriefS : public Clothes						//具体的装饰类 内裤
{
public:
void show()
{
cout<<"内裤 ";								//输出内裤
Clothes::show();							//调用基类的show函数  输出人名
}
};

class Overcoat : public Clothes						//具体的装饰类 大衣
{
public:
void show()
{
cout<<"大衣 ";								//输出大衣
Clothes::show();							//调用基类的show函数  输出人名
}
};

int main()
{
People *P = new People("小明"); 				//定义人类实例  并将名字传入构造函数

cout<<"\n第一种装扮:\n";
Tshirts *T = new Tshirts;						//定义T恤实例
Shoes *S = new Shoes;							//定义鞋子实例
Jeans *J = new Jeans;							//定义牛仔裤实例
T->decorate(P);									//T调用基类Clothes的decorate函数
S->decorate(T);									//S调用基类Clothes的decorate函数
J->decorate(S);									//J调用基类Clothes的decorate函数
J->show();										//此时基类Clothes中的m_peo为S(强制转化为People),不为空,调用基类的show

cout<<"\n第二种装扮:\n";
Overcoat *O = new Overcoat;
BriefS *B = new BriefS;
Shoes  *S0 = new Shoes;
S0->decorate(P);
B->decorate(S0);
O->decorate(B);
O->show();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: