zoukankan      html  css  js  c++  java
  • 游戏开发中的设计模式之一-Strategy模式

    1.  定义

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

    2.  设计原则

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

    3.  实例

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

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

    4. 代码实现

     

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

    1. // ***************************************************************
    2. //  Strategy   version:  1.0   ·  date: 09/01/2008
    3. //  -------------------------------------------------------------
    4. //  Author: Wang Liuqiang
    5. //  E-mail: wlq_729@163.com
    6. //  -------------------------------------------------------------
    7. //  Copyright (C) 2008 - All Rights Reserved
    8. // ***************************************************************
    9. #ifndef STRATEGY_H_
    10. #define STRATEGY_H_
    11. class WeaponBehavior;
    12. class Character
    13. {
    14. public:
    15.     Character();
    16.     Character(WeaponBehavior* pWeapon);
    17.     
    18.     ~Character();
    19.     void fight();
    20.     void SetWeapon(WeaponBehavior* w);
    21. private:
    22.     WeaponBehavior* m_weapor;
    23. };
    24. class Queue : public Character
    25. {
    26. public:
    27.     Queue();
    28.     ~Queue();
    29. };
    30. class King : public Character
    31. {
    32. public:
    33.     King();
    34.     ~King();
    35. };
    36. class Troll : public Character
    37. {
    38. public:
    39.     Troll();
    40.     ~Troll();
    41. };
    42. class Knight : public Character
    43. {
    44. public:
    45.     Knight();
    46.     ~Knight();
    47. };
    48. class WeaponBehavior
    49. {
    50. public:
    51.     WeaponBehavior();
    52.     ~WeaponBehavior();
    53.     virtual void useWeapon() = 0;
    54. };
    55. class KnifeBehvior : public WeaponBehavior
    56. {
    57. public:
    58.     KnifeBehvior();
    59.     ~KnifeBehvior();
    60.     virtual void useWeapon();
    61. };
    62. class BowAndArrorBehavior : public WeaponBehavior
    63. {
    64. public:
    65.     BowAndArrorBehavior();
    66.     ~BowAndArrorBehavior();
    67.     virtual void useWeapon();
    68. };
    69. class AxeBehavior : public WeaponBehavior
    70. {
    71. public:
    72.     AxeBehavior();
    73.     ~AxeBehavior();
    74.     virtual void useWeapon();
    75. };
    76. class SwordBehavior : public WeaponBehavior
    77. {
    78. public:
    79.     SwordBehavior();
    80.     ~SwordBehavior();
    81.     virtual void useWeapon();
    82. };
    83. #endif

     

     

    /*********************Strategy.cpp*****************************/

    1. #include "Strategy.h"
    2. #include <iostream>
    3. using namespace std;
    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.         delete m_weapor;
    16.         m_weapor = NULL;
    17.     }
    18. }
    19. void Character::fight()
    20. {
    21.     m_weapor->useWeapon();
    22. }
    23. void Character::SetWeapon(WeaponBehavior* w)
    24. {
    25.     m_weapor = w;
    26. }
    27. Queue::Queue():Character(new KnifeBehvior())
    28. {
    29. }
    30. Queue::~Queue()
    31. {
    32. }
    33. King::King():Character(new SwordBehavior())
    34. {
    35. }
    36. King::~King()
    37. {
    38. }
    39. Troll::Troll():Character(new AxeBehavior())
    40. {
    41. }
    42. Knight::Knight():Character(new BowAndArrorBehavior())
    43. {
    44. }
    45. WeaponBehavior::WeaponBehavior()
    46. {
    47. }
    48. WeaponBehavior::~WeaponBehavior()
    49. {
    50. }
    51. KnifeBehvior::KnifeBehvior()
    52. {
    53. }
    54. KnifeBehvior::~KnifeBehvior()
    55. {
    56. }
    57. void KnifeBehvior::useWeapon()
    58. {
    59.     cout<<"Fight use Knife!"<<endl;
    60. }
    61. AxeBehavior::AxeBehavior()
    62. {
    63. }
    64. AxeBehavior::~AxeBehavior()
    65. {
    66. }
    67. void AxeBehavior::useWeapon()
    68. {
    69.     cout<<"Fight use Axe!"<<endl;
    70. }
    71. SwordBehavior::SwordBehavior()
    72. {
    73. }
    74. SwordBehavior::~SwordBehavior()
    75. {
    76. }
    77. void SwordBehavior::useWeapon()
    78. {
    79.     cout<<"Fight use Sword!"<<endl;
    80. }
    81. BowAndArrorBehavior::BowAndArrorBehavior()
    82. {
    83. }
    84. BowAndArrorBehavior::~BowAndArrorBehavior()
    85. {
    86. }
    87. void BowAndArrorBehavior::useWeapon()
    88. {
    89.     cout<<"Fight use BowAndArrow!"<<endl;
    90. }

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

    1. #include "Strategy.h"
    2. void main()
    3. {
    4.     Character* character = new King();
    5.     character->fight();
    6.     
    7.     character = new Queue();
    8.     character->fight();
    9.     character = new Troll();
    10.     character->fight();
    11.     character = new Knight();
    12.     character->fight();
    13.     WeaponBehavior* pWeapon = new SwordBehavior();
    14.     character->SetWeapon(pWeapon);
    15.     character->fight();
    16.     delete character;
    17.     character = 0;
    18. }
  • 相关阅读:
    day04 列表和元组
    Python2和Python3的区别
    Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境
    Patrick Hughes
    Ruby学习笔记1 -- 基本语法和数据类型, Class
    Javascript学习笔记5
    php学习笔记1——使用phpStudy进行php运行环境搭建与测试。
    Linux配置和管理msyql命令
    干净win7要做几步才能运行第一个Spring MVC 写的动态web程序
    The difference between Spring Tool Suite and Spring IDE
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167987.html
Copyright © 2011-2022 走看看