看完了几个原则后,我又开始看装饰模式,将一些装饰用的方法从主类中分离,并且将具体的装饰步骤隔离开了,使得主类更加的简便。
这样做的最大好处就是,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。
#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;
}