游戏开发中的设计模式之一-Strategy模式
1. 定义
Strategy模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
2. 设计原则
找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起
3. 实例
我们在游戏中经常看到有不同的角色,各种角色使用不同的武器,并且还可以更换武器。该问题可以抽象为如下描述:游戏角色类及武器行为类,每个角色一次只能使用一个武器,但是可以在游戏过程中更换武器。
通过分析,该应用可以使用Strategy模式解决,并给出类图如下,类图使用Rose逆向生成的,有点乱:)图片比较大,如果显示不完整,大家可以保存到本地打开看:
4. 代码实现
/*****************Strategy.h**************************/
- //***************************************************************
- //Strategyversion:1.0·date:09/01/2008
- //-------------------------------------------------------------
- //Author:WangLiuqiang
- //E-mail:[email protected]
- //-------------------------------------------------------------
- //Copyright(C)2008-AllRightsReserved
- //***************************************************************
- #ifndefSTRATEGY_H_
- #defineSTRATEGY_H_
- classWeaponBehavior;
- classCharacter
- {
- public:
- Character();
- Character(WeaponBehavior*pWeapon);
- ~Character();
- voidfight();
- voidSetWeapon(WeaponBehavior*w);
- private:
- WeaponBehavior*m_weapor;
- };
- classQueue:publicCharacter
- {
- public:
- Queue();
- ~Queue();
- };
- classKing:publicCharacter
- {
- public:
- King();
- ~King();
- };
- classTroll:publicCharacter
- {
- public:
- Troll();
- ~Troll();
- };
- classKnight:publicCharacter
- {
- public:
- Knight();
- ~Knight();
- };
- classWeaponBehavior
- {
- public:
- WeaponBehavior();
- ~WeaponBehavior();
- virtualvoiduseWeapon()=0;
- };
- classKnifeBehvior:publicWeaponBehavior
- {
- public:
- KnifeBehvior();
- ~KnifeBehvior();
- virtualvoiduseWeapon();
- };
- classBowAndArrorBehavior:publicWeaponBehavior
- {
- public:
- BowAndArrorBehavior();
- ~BowAndArrorBehavior();
- virtualvoiduseWeapon();
- };
- classAxeBehavior:publicWeaponBehavior
- {
- public:
- AxeBehavior();
- ~AxeBehavior();
- virtualvoiduseWeapon();
- };
- classSwordBehavior:publicWeaponBehavior
- {
- public:
- SwordBehavior();
- ~SwordBehavior();
- virtualvoiduseWeapon();
- };
- #endif
/*********************Strategy.cpp*****************************/
- #include"Strategy.h"
- #include<iostream>
- usingnamespacestd;
- Character::Character():m_weapor(NULL)
- {
- }
- Character::Character(WeaponBehavior*pWeapon)
- {
- m_weapor=pWeapon;
- }
- Character::~Character()
- {
- if(m_weapor!=NULL)
- {
- deletem_weapor;
- m_weapor=NULL;
- }
- }
- voidCharacter::fight()
- {
- m_weapor->useWeapon();
- }
- voidCharacter::SetWeapon(WeaponBehavior*w)
- {
- m_weapor=w;
- }
- Queue::Queue():Character(newKnifeBehvior())
- {
- }
- Queue::~Queue()
- {
- }
- King::King():Character(newSwordBehavior())
- {
- }
- King::~King()
- {
- }
- Troll::Troll():Character(newAxeBehavior())
- {
- }
- Knight::Knight():Character(newBowAndArrorBehavior())
- {
- }
- WeaponBehavior::WeaponBehavior()
- {
- }
- WeaponBehavior::~WeaponBehavior()
- {
- }
- KnifeBehvior::KnifeBehvior()
- {
- }
- KnifeBehvior::~KnifeBehvior()
- {
- }
- voidKnifeBehvior::useWeapon()
- {
- cout<<"FightuseKnife!"<<endl;
- }
- AxeBehavior::AxeBehavior()
- {
- }
- AxeBehavior::~AxeBehavior()
- {
- }
- voidAxeBehavior::useWeapon()
- {
- cout<<"FightuseAxe!"<<endl;
- }
- SwordBehavior::SwordBehavior()
- {
- }
- SwordBehavior::~SwordBehavior()
- {
- }
- voidSwordBehavior::useWeapon()
- {
- cout<<"FightuseSword!"<<endl;
- }
- BowAndArrorBehavior::BowAndArrorBehavior()
- {
- }
- BowAndArrorBehavior::~BowAndArrorBehavior()
- {
- }
- voidBowAndArrorBehavior::useWeapon()
- {
- cout<<"FightuseBowAndArrow!"<<endl;
- }
/********************Main.cpp****************************/
- #include"Strategy.h"
- voidmain()
- {
- Character*character=newKing();
- character->fight();
- character=newQueue();
- character->fight();
- character=newTroll();
- character->fight();
- character=newKnight();
- character->fight();
- WeaponBehavior*pWeapon=newSwordBehavior();
- character->SetWeapon(pWeapon);
- character->fight();
- deletecharacter;
- character=0;
- }