1.装饰模式简介
- 英文名称
Decorator - 主要目的
该模式可以动态地给一个对象添加一些额外的职责。 - 使用场景
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
2.处理那些可以撤销的职责;
3.当不能采用生成子类的方法进行扩充时。
2.装饰模式代码示例
- 测试平台
1.开发语言:C++
2.开发工具:VS2015
3.操作系统:Win7 X64 代码说明
1.Role–抽象角色类,提供接口;
2.RealPlayer–具体角色类,本例中用来表示游戏任务;
3.Decorator–装饰类;
4.ConcreateAction1、ConcreateAction2–具体装饰类,本例中表示角色动作。注意:
1.本例用装饰模式来表示游戏任务的一系列动作;
2.通过装饰模式,我们可以指定一个游戏角色完成任意顺序的动作,而不用改动原有的角色类。具体代码
#include <iostream>
#include <string>
using namespace std;
//抽象角色类
class Role
{
public:
virtual void Action() = 0; //抽象行动类
};
//具体角色类
class RealPlayer : public Role
{
public:
void Action()
{
cout << "动作结束" << endl;
}
};
//装饰类
class Decorator : public Role
{
public:
Decorator(Role * pRole) : m_pRoleObj(pRole) {}
void Action()
{
if (m_pRoleObj != NULL)
{
m_pRoleObj->Action();
}
}
protected:
Role *m_pRoleObj;
};
//具体装饰类:出拳
class ConcreateAction1 : public Decorator
{
public:
ConcreateAction1(Role *pDecorator) : Decorator(pDecorator) {}
void Action()
{
AddedBehavior();
Decorator::Action();
}
void AddedBehavior()
{
cout << "出拳 " << endl;
}
};
//具体动作装饰类:踢腿
class ConcreateAciton2 : public Decorator
{
public:
ConcreateAciton2(Role *pDecorator) : Decorator(pDecorator) {}
void Action()
{
AddedBehavior();
Decorator::Action();
}
void AddedBehavior()
{
cout << "踢腿 " << endl;
}
};
int main()
{
Role* pRole = new RealPlayer();
//让角色出拳
Decorator* pAction1 = new ConcreateAction1(pRole);
//让角色踢腿
Decorator* pAction2 = new ConcreateAciton2(pAction1);
pAction2->Action();
delete pRole;
pRole = NULL;
delete pAction1;
pAction1 = NULL;
delete pAction2;
pAction2 = NULL;
getchar();
return 0;
}
- 输出结果
栏目导航
上一篇:设计模式学习笔记(C++实现)(九)–组合模式
下一篇:设计模式学习笔记(C++实现)(十一)–外观模式
参考文献:
1.《设计模式:可复用面向对象软件的基础》