// 设计模式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