游戏开发中的设计模式之一-Strategy模式

1. 定义

Strategy模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2. 设计原则

找出应用中可能需要变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起

3. 实例

我们在游戏中经常看到有不同的角色,各种角色使用不同的武器,并且还可以更换武器。该问题可以抽象为如下描述:游戏角色类及武器行为类,每个角色一次只能使用一个武器,但是可以在游戏过程中更换武器。

通过分析,该应用可以使用Strategy模式解决,并给出类图如下,类图使用Rose逆向生成的,有点乱:)图片比较大,如果显示不完整,大家可以保存到本地打开看:

游戏开发中的设计模式之一-Strategy模式

4. 代码实现

/*****************Strategy.h**************************/

  1. //***************************************************************
  2. //Strategyversion:1.0·date:09/01/2008
  3. //-------------------------------------------------------------
  4. //Author:WangLiuqiang
  5. //E-mail:[email protected]
  6. //-------------------------------------------------------------
  7. //Copyright(C)2008-AllRightsReserved
  8. //***************************************************************
  9. #ifndefSTRATEGY_H_
  10. #defineSTRATEGY_H_
  11. classWeaponBehavior;
  12. classCharacter
  13. {
  14. public:
  15. Character();
  16. Character(WeaponBehavior*pWeapon);
  17. ~Character();
  18. voidfight();
  19. voidSetWeapon(WeaponBehavior*w);
  20. private:
  21. WeaponBehavior*m_weapor;
  22. };
  23. classQueue:publicCharacter
  24. {
  25. public:
  26. Queue();
  27. ~Queue();
  28. };
  29. classKing:publicCharacter
  30. {
  31. public:
  32. King();
  33. ~King();
  34. };
  35. classTroll:publicCharacter
  36. {
  37. public:
  38. Troll();
  39. ~Troll();
  40. };
  41. classKnight:publicCharacter
  42. {
  43. public:
  44. Knight();
  45. ~Knight();
  46. };
  47. classWeaponBehavior
  48. {
  49. public:
  50. WeaponBehavior();
  51. ~WeaponBehavior();
  52. virtualvoiduseWeapon()=0;
  53. };
  54. classKnifeBehvior:publicWeaponBehavior
  55. {
  56. public:
  57. KnifeBehvior();
  58. ~KnifeBehvior();
  59. virtualvoiduseWeapon();
  60. };
  61. classBowAndArrorBehavior:publicWeaponBehavior
  62. {
  63. public:
  64. BowAndArrorBehavior();
  65. ~BowAndArrorBehavior();
  66. virtualvoiduseWeapon();
  67. };
  68. classAxeBehavior:publicWeaponBehavior
  69. {
  70. public:
  71. AxeBehavior();
  72. ~AxeBehavior();
  73. virtualvoiduseWeapon();
  74. };
  75. classSwordBehavior:publicWeaponBehavior
  76. {
  77. public:
  78. SwordBehavior();
  79. ~SwordBehavior();
  80. virtualvoiduseWeapon();
  81. };
  82. #endif

/*********************Strategy.cpp*****************************/
  1. #include"Strategy.h"
  2. #include<iostream>
  3. usingnamespacestd;
  4. Character::Character():m_weapor(NULL)
  5. {
  6. }
  7. Character::Character(WeaponBehavior*pWeapon)
  8. {
  9. m_weapor=pWeapon;
  10. }
  11. Character::~Character()
  12. {
  13. if(m_weapor!=NULL)
  14. {
  15. deletem_weapor;
  16. m_weapor=NULL;
  17. }
  18. }
  19. voidCharacter::fight()
  20. {
  21. m_weapor->useWeapon();
  22. }
  23. voidCharacter::SetWeapon(WeaponBehavior*w)
  24. {
  25. m_weapor=w;
  26. }
  27. Queue::Queue():Character(newKnifeBehvior())
  28. {
  29. }
  30. Queue::~Queue()
  31. {
  32. }
  33. King::King():Character(newSwordBehavior())
  34. {
  35. }
  36. King::~King()
  37. {
  38. }
  39. Troll::Troll():Character(newAxeBehavior())
  40. {
  41. }
  42. Knight::Knight():Character(newBowAndArrorBehavior())
  43. {
  44. }
  45. WeaponBehavior::WeaponBehavior()
  46. {
  47. }
  48. WeaponBehavior::~WeaponBehavior()
  49. {
  50. }
  51. KnifeBehvior::KnifeBehvior()
  52. {
  53. }
  54. KnifeBehvior::~KnifeBehvior()
  55. {
  56. }
  57. voidKnifeBehvior::useWeapon()
  58. {
  59. cout<<"FightuseKnife!"<<endl;
  60. }
  61. AxeBehavior::AxeBehavior()
  62. {
  63. }
  64. AxeBehavior::~AxeBehavior()
  65. {
  66. }
  67. voidAxeBehavior::useWeapon()
  68. {
  69. cout<<"FightuseAxe!"<<endl;
  70. }
  71. SwordBehavior::SwordBehavior()
  72. {
  73. }
  74. SwordBehavior::~SwordBehavior()
  75. {
  76. }
  77. voidSwordBehavior::useWeapon()
  78. {
  79. cout<<"FightuseSword!"<<endl;
  80. }
  81. BowAndArrorBehavior::BowAndArrorBehavior()
  82. {
  83. }
  84. BowAndArrorBehavior::~BowAndArrorBehavior()
  85. {
  86. }
  87. voidBowAndArrorBehavior::useWeapon()
  88. {
  89. cout<<"FightuseBowAndArrow!"<<endl;
  90. }

/********************Main.cpp****************************/

  1. #include"Strategy.h"
  2. voidmain()
  3. {
  4. Character*character=newKing();
  5. character->fight();
  6. character=newQueue();
  7. character->fight();
  8. character=newTroll();
  9. character->fight();
  10. character=newKnight();
  11. character->fight();
  12. WeaponBehavior*pWeapon=newSwordBehavior();
  13. character->SetWeapon(pWeapon);
  14. character->fight();
  15. deletecharacter;
  16. character=0;
  17. }