php设计模式之职责链模式实例分析【星际争霸游戏案例】

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

星际的兵种属性随着对平衡性的调节,会进行修改,如果这样的话,我们就要考虑减少一个事件和具体处理的关联性。

比如一颗原子弹投下的瞬间,在杀伤范围内的部队或者建筑都会减少血,但是随着距离中心点的远近,受损程度是不同的,而且不同的兵种和建筑受损情况是不同的。

待解决的问题:原子弹投下的瞬间,将杀伤的处理分别交给杀伤范围内的部队或者建筑自己的方法处理。

思路:建立一个接口,让所有的部队或者建筑实现。

职责链模式(Chain of Responsibility)示例:

  1. <?php
  2. //被原子弹攻击的接口
  3. interface NuclearAttacked
  4. {
  5. //处理被原子弹攻击的方法,参数为投放点的x和y坐标
  6. public function NuclearAttacked($x, $y);
  7. }
  8. //人族的基地,实现被原子弹攻击的接口,其他的内容暂时不考虑
  9. class CommandCenter implements NuclearAttacked
  10. {
  11. //处理被原子弹攻击的方法,参数为投放点的x和y坐标
  12. public function NuclearAttacked($x, $y)
  13. {
  14. //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉
  15. }
  16. }
  17. //巡洋舰(俗称大和),实现被原子弹攻击的接口,其他的内容暂时不考虑
  18. class Battlecruiser implements NuclearAttacked
  19. {
  20. //处理被原子弹攻击的方法,参数为投放点的x和y坐标
  21. public function NuclearAttacked($x, $y)
  22. {
  23. //根据离原子弹中心的距离,定义减少的血,如果超出了剩余的血,就炸掉
  24. }
  25. }
  26. //原子弹类
  27. class Nuclear
  28. {
  29. //被原子弹攻击的对象
  30. public $attackedThings;
  31. //添加被原子弹攻击的对象
  32. public function addAttackedThings($thing)
  33. {
  34. //添加被原子弹攻击的对象
  35. $this->attackedThings[] = $thing;
  36. }
  37. //原子弹爆炸的方法,参数为投放点的x和y坐标
  38. public function blast($x, $y)
  39. {
  40. //把爆炸的事情交给所有涉及的对象,让他们自己处理
  41. foreach ($this->attackedThings as $thing)
  42. {
  43. //把爆炸的事情交给所有涉及的对象,让他们自己处理
  44. $thing->NuclearAttacked($x, $y);
  45. }
  46. }
  47. }
  48. //新建一个基地对象
  49. $CommandCenter = new CommandCenter();
  50. //新建一个巡洋舰对象
  51. $Battlecruiser = new Battlecruiser();
  52. //造了一颗原子弹
  53. $Nuclear2 = new Nuclear();
  54. //假设投放成功,那个瞬间一个基地对象和一个巡洋舰对象在杀伤范围内
  55. $Nuclear2->addAttackedThings($CommandCenter);
  56. $Nuclear2->addAttackedThings($Battlecruiser);
  57. //原子弹爆炸,这样就把这个事件交给那些涉及的对象的处理方法,假设投放点的x和y坐标是2353, 368
  58. $Nuclear2->blast(2353, 368);
  59. ?>

用途总结:职责链模式可以将一个涉及到多个对象的事件的处理交给对象自己处理,减少关联性。

实现总结:需要一个处理事件的接口,然后让所有的对象实现。