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

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


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

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值