php设计模式之策略模式实例分析【星际争霸游戏案例】

本文实例讲述了php设计模式之策略模式,分享给大家供大家参考,具体如下:

星际开地图对战,等5秒钟进入地图后,每个玩家都会拥有一个基地,几个农民等,还会有初始的人口供给。但这些是根据种族的不同而不同。

待解决的问题:我们需要根据种族的不同,而对玩家进行不同的初始化,最好将这些不同的处理方式封装。

思路:定义初始化的接口,然后制作不同种族的初始化类。

策略模式(Strategy)示例:

为了使代码不至于过长,一部分类的定义不在此写出,如果要调试,请用字符串等方式替代new。

  1. <?php
  2. //玩家的类
  3. class player
  4. {
  5. //所属种族
  6. public $race;
  7. //部队
  8. public $army;
  9. //建筑
  10. public $building;
  11. //人口供给
  12. public $supply;
  13. //构造函数,设定所属种族
  14. public function __construct($race)
  15. {
  16. $this->race = $race;
  17. }
  18. }
  19. //初始化的接口
  20. interface initialPlayer
  21. {
  22. //制造初始化的部队
  23. public function giveArmy($player);
  24. //制造初始化的建筑
  25. public function giveBuilding($player);
  26. //初始化人口供给
  27. public function giveSupply($player);
  28. }
  29. //虫族的初始化算法
  30. class zergInitial implements initialPlayer
  31. {
  32. //制造初始化的部队
  33. public function giveArmy($player)
  34. {
  35. //一个Overlord
  36. $player->army[] = new Overlord();
  37. //四个虫族农民
  38. for($i=0; $i<4;$i++)
  39. {
  40. $player->army[] = new Drone();
  41. }
  42. }
  43. //制造初始化的建筑
  44. public function giveBuilding($player)
  45. {
  46. //一个基地
  47. $player->building[] = new Hatchery();
  48. }
  49. //初始化人口供给
  50. public function giveSupply($player)
  51. {
  52. //虫族初始人口供给为9
  53. $player->supply = 9;
  54. }
  55. }
  56. //人族的初始化算法
  57. class terranInitial implements initialPlayer
  58. {
  59. //制造初始化的部队
  60. public function giveArmy($player)
  61. {
  62. //四个人族农民
  63. for($i=0; $i<4;$i++)
  64. {
  65. $player->army[] = new SVC();
  66. }
  67. }
  68. //制造初始化的建筑
  69. public function giveBuilding($player)
  70. {
  71. //一个基地
  72. $player->building[] = new Hatchery();
  73. }
  74. //初始化人口供给
  75. public function giveSupply($player)
  76. {
  77. //人族初始人口供给为10
  78. $player->supply = 10;
  79. }
  80. }
  81. //初始化的控制类
  82. class initialController
  83. {
  84. //构造函数,参数为玩家的数组
  85. public function __construct($playerArray)
  86. {
  87. foreach ($playerArray as $player)
  88. {
  89. switch ($player->race)
  90. {
  91. case 'zerg':
  92. $initialController = new zergInitial();
  93. break;
  94. case 'terran':
  95. $initialController = new terranInitial();
  96. break;
  97. }
  98. $initialController->giveArmy($player);
  99. $initialController->giveBuilding($player);
  100. $initialController->giveSupply($player);
  101. }
  102. }
  103. }
  104. //假设两个虫族,一个人族
  105. $playerArray = array(
  106. new player('zerg'),
  107. new player('zerg'),
  108. new player('terran'),
  109. );
  110. //进行初始化工作
  111. $initialController = new initialController($playerArray);
  112. ?>

用途总结:策略模式可以将不同情况下的算法封装,根据具体的情况调用。

实现总结:需要一个接口,规定算法规范,使用者(比如初始化来)只要调用对应的算法就可以了。