// 设计模式Demo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//要被装饰的对象基类(Component),这里用人物基类表示
class BaseCharacter
{
public:
virtual void func() = 0;
};
//要被修饰的对象(ConcreateComponent),这里用玩家表示
class Player : public BaseCharacter
{
public:
void func() override
{
cout<<"I am Character. I don't have any equipment"<<endl;
}
};
//装饰基类(Decorator),这里用装备基类表示
class EquipmentBase : public BaseCharacter
{
private:
BaseCharacter* m_pCharacter;
public:
void setCharacter(BaseCharacter* c)
{
m_pCharacter = c;
}
//重写function,执行character的func方法
void func() override
{
if (m_pCharacter)
m_pCharacter->func();
}
};
//具体装饰类(ConcreateDecorater),这里用武器表示
class Weapon : public EquipmentBase
{
private:
//增加一个字段
string m_weapon;
public:
void func() override
{
//先执行基类的方法
EquipmentBase::func();
//执行装饰类特有的方法
m_weapon = "But now I have a gun!";
cout<<m_weapon<<endl;
}
};
//具体装饰类(ConcreateDecorater),这里用衣服表示
class Clothes : public EquipmentBase
{
public:
void equipCloth()
{
cout<<"But now I have clothes"<<endl;
}
void func() override
{
EquipmentBase::func();
equipCloth();
}
};
//客户端
int _tmain(int argc, _TCHAR* argv[])
{
BaseCharacter* character = new Player();
Weapon* weapon = new Weapon();
Clothes* clothes = new Clothes();
/*
这里可能有些不太恰当,所说的装备并不是真正的装备,而是装备了装备的玩家
即通过了装备类,使玩家变成了有装备的玩家
*/
//没有装备的玩家
cout<<"Before Equip:"<<endl;
character->func();
//装备武器的玩家
cout<<"After Equip a weapon:"<<endl;
weapon->setCharacter(character);
weapon->func();
//再装备衣服的玩家
cout<<"After Equip clothes:"<<endl;
clothes->setCharacter(weapon);
clothes->func();
system("pause");
return 0;
}
这个例子写的是一个玩家和装备之间的关系,但是稍微有些不恰当,例子中的装备类并非仅仅表示一个装备,由于装备类继承了玩家类,所以这里表示的是装备了装备的玩家。原文地址:http://blog.csdn.net/puppet_master/article/details/46484195