装饰者模式指的是动态的将责任附加到对象上,想要扩展其功能,装饰者提供有别于继承的另外一种选择。(参考《Head First 设计模式》)c++
我的理解:装饰者就是一种类包类 就是在构造函数里面,添加类做为参数。编程
首先是基准类的头文件,男生女生都是人 因此以人做为基准类的声明以下,定义了两个纯虚函数,一个是人的类别,一个是人的行为。设计模式
//全部的基类 人
class People {
public:
virtual void personType()= 0; //人的类型
virtual void personAction() = 0; //人的活动
};
复制代码
接下来是被装饰者男生女生各自的类的行为和活动bash
头文件:函数
//被装饰者 :男生
class Boy:public People
{
public:
//继承人的两个方法
void personType();
void personAction();
};
//被装饰者:女生
class Girl:public People
{
public:
void personType();
void personAction();
};
复制代码
各自类的实现以下:测试
//实现相关类
//男生类
void Boy::personType()
{
cout << "Boy:" << endl;
}
void Boy::personAction()
{
cout << "Boy要作的事情是" << endl;
}
//女生类
void Girl::personType()
{
cout << "Girl:" << endl;
}
void Girl::personAction()
{
cout << "Girl要作的事情是" << endl;
}
复制代码
接下来是定义一个装饰行为的基类,也是继承于人,这个是装饰者模式必需要作的一个东西。ui
装饰者基类的声明spa
//装饰者行为基类:继承于人
class PersonConduct:public People
{
public:
PersonConduct(People *cur_people);
void personType();
void personAction();
protected:
People *m_pPeople;
};
复制代码
接下来是两个吃饭和洗澡行为的声明设计
//装饰行为:吃饭
class Eat:public PersonConduct
{
public:
Eat(People *cur_people):PersonConduct(cur_people){}
void personType();
void personAction();
};
//装饰行为:洗澡
class Bash:public PersonConduct
{
public:
Bash(People *cur_people):PersonConduct(cur_people){}
void personType();
void personAction();
};
复制代码
其中一个主要的点,须要构造函数中添加 基类的指针,以实现可以调用被装饰者的动做。3d
具体装饰行为类实现的代码以下:
//装饰行为基类
PersonConduct::PersonConduct(People *cur_people)
{
m_pPeople= cur_people;
}
void PersonConduct::personType()
{
m_pPeople->personType();
}
void PersonConduct::personAction()
{
m_pPeople->personAction();
}
//装饰行为:基类
void Eat::personType()
{
m_pPeople->personType();
cout << "肚子很饿" << endl;
return;
}
void Eat::personAction()
{
m_pPeople->personAction();
cout << "正在吃饭" << endl;
}
//装饰行为:洗澡类
void Bash::personType()
{
m_pPeople->personType();
cout << "身上有味道" << endl;
}
void Bash::personAction()
{
m_pPeople->personAction();
cout << "正在洗澡" << endl;
}
复制代码
测试是否实现装饰者模式的代码以下:
People * cur_boy = new Boy();
People * cur_girl = new Girl();
PersonConduct * cur_eat_action = new Eat(cur_girl); //绑定女孩
cur_eat_action->personType();
cur_eat_action->personAction();
PersonConduct * cur_bash_action = new Bash(cur_boy);//绑定男孩
cur_bash_action->personType();
cur_bash_action->personAction();
复制代码
执行结果:
能够看出,完美的实现了装饰者行为,固然,代码还有不完善的地方 在于没有释放内存最后。都要delete 指针。可是但愿能够帮助你们很好的理解装饰者模式。
显然 装饰者模式的好处显而易见,就是对象和操做分离,能够这么理解。吃饭不是只有男生能吃,也不是只有女生能吃,若是使用继承的话,须要写男生继承一次,女生继承一次,若是有不少行为的话,显然代码量巨大,因此使用装饰者模式能够很好的解决这一问题,固然,若是当对象是单一的状况下,使用装饰者模式就显得很麻烦了,由于还要写装饰者基类啥的,每一个行为一个类 很麻烦,但愿你们能够活学活用最好。这也是设计模式的意义所在。
头文件:
#include "stdafx.h"
using namespace std;
//全部的基类 人
class People {
public:
virtual void personType()= 0; //人的类型
virtual void personAction() = 0; //人的活动
};
//被装饰者 :男生
class Boy:public People
{
public:
//继承人的两个方法
void personType();
void personAction();
};
//被装饰者:女生
class Girl:public People
{
public:
void personType();
void personAction();
};
//装饰者行为基类:继承于人
class PersonConduct:public People
{
public:
PersonConduct(People *cur_people);
void personType();
void personAction();
protected:
People *m_pPeople;
};
//装饰行为:吃饭
class Eat:public PersonConduct
{
public:
Eat(People *cur_people):PersonConduct(cur_people){}
void personType();
void personAction();
};
//装饰行为:洗澡
class Bash:public PersonConduct
{
public:
Bash(People *cur_people):PersonConduct(cur_people){}
void personType();
void personAction();
};
复制代码
实现文件
// DecorationMode.cpp : 定义控制台应用程序的入口点。
// 装饰者模式
#include "stdafx.h"
#include "DecorationMode.h"
using namespace std;
//实现相关类
//男生类
void Boy::personType()
{
cout << "Boy:" << endl;
}
void Boy::personAction()
{
cout << "Boy要作的事情是" << endl;
}
//女生类
void Girl::personType()
{
cout << "Girl:" << endl;
}
void Girl::personAction()
{
cout << "Girl要作的事情是" << endl;
}
//装饰行为基类
PersonConduct::PersonConduct(People *cur_people)
{
m_pPeople= cur_people;
}
void PersonConduct::personType()
{
m_pPeople->personType();
}
void PersonConduct::personAction()
{
m_pPeople->personAction();
}
//装饰行为:基类
void Eat::personType()
{
m_pPeople->personType();
cout << "肚子很饿" << endl;
return;
}
void Eat::personAction()
{
m_pPeople->personAction();
cout << "正在吃饭" << endl;
}
//装饰行为:洗澡类
void Bash::personType()
{
m_pPeople->personType();
cout << "身上有味道" << endl;
}
void Bash::personAction()
{
m_pPeople->personAction();
cout << "正在洗澡" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
People * cur_boy = new Boy();
People * cur_girl = new Girl();
PersonConduct * cur_eat_action = new Eat(cur_girl); //绑定女孩
cur_eat_action->personType();
cur_eat_action->personAction();
PersonConduct * cur_bash_action = new Bash(cur_boy);//绑定男孩
cur_bash_action->personType();
cur_bash_action->personAction();
return 0;
}
复制代码