设计模式学习笔记(5) - 策略模式

  1. 云栖社区>
  2. 博客>
  3. 正文

设计模式学习笔记(5) - 策略模式

余二五 2017-11-15 16:07:00 浏览617
展开阅读全文

我一直觉得策略模式是一个很好玩的模式,让我们用游戏来了解一下。

举一个武侠的例子:

小说中大侠一般都有两样功夫:
第一:武功
第二:轻功

说到武功,让我们看看天龙八部里的三位高手的绝招:
萧峰:降龙十八掌
虚竹:北冥神功,天山折梅手,天山六阳掌,生死符
段誉:六脉神剑

再看看轻功:
萧峰:普通轻功
虚竹:普通轻功
段誉:凌波微步

我们想在游戏里创建一个角色,叫萧峰。
让他施展轻功跟段誉比比脚力,再使武功和段誉比比

我们还想创建一个新角色,叫凡星
凡星施展了一段凌波微步,再施展了一招六脉神剑,再一招降龙十八掌,将一只蚊子击落掌下

好吧,想像力总是无限的,让我们来看一下程序怎么来实现,看代码:


  1. // 武功接口 
  2. interface WuGong 
  3.     public function perform(); 
  4.  
  5. // 传说中的降龙十八掌,威力不俗 
  6. class XiangLongWuGong implements WuGong 
  7.     public function perform() 
  8.     { 
  9.         echo "施展了降龙十八掌\n"
  10.     } 
  11.  
  12. // 远程攻击的六脉神剑,一般说来,远程攻击的伤害都不高 
  13. class SixSwordWuGong 
  14.     public function perform() 
  15.     { 
  16.         echo "施展了六脉神剑\n"
  17.     } 
  18.  
  19. // ------------------------------------------------------------- 
  20.  
  21. // 轻功接口 
  22. interface QingGong 
  23.     public function perform(); 
  24.  
  25. class CommonQingGong implements QingGong 
  26.     public function perform() 
  27.     { 
  28.         echo "施展了轻功\n"
  29.     } 
  30.  
  31. class LingBoQingGong implements QingGong 
  32.     public function perform() 
  33.     { 
  34.         echo "施展了凌波微步\n"
  35.     } 
  36.  
  37. // ------------------------------------------------------------- 
  38.  
  39. // 人物,因为施展功夫是天生的属性,所以不用接口用抽象 
  40. abstract class Role 
  41.     // 人物有两个属性,一个是功夫,一个是轻功 
  42.     protected $_gongfu
  43.     protected $_qinggong
  44.  
  45.     public abstract function name(); 
  46.  
  47.     public function performGongFu() 
  48.     { 
  49.         $this->_gongfu->perform(); 
  50.     } 
  51.  
  52.     public function performQingGong() 
  53.     { 
  54.         $this->_qinggong->perform(); 
  55.     } 
  56.  
  57.     public function setGongFu($gongfu
  58.     { 
  59.         $this->_gongfu = $gongfu
  60.     } 
  61.  
  62.     public function setQingGong($qinggong
  63.     { 
  64.         $this->_qinggong = $qinggong
  65.     } 
  66.  
  67. // 萧峰,这个可能是个NPC 
  68. class XiaoFeng extends Role 
  69.     public function __construct() 
  70.     { 
  71.         $this->_gongfu   = new XiangLongWuGong(); 
  72.         $this->_qinggong = new CommonQingGong(); 
  73.     } 
  74.     public function name() 
  75.     { 
  76.         echo "萧峰\n"
  77.     } 
  78.  
  79. // 段誉,这个也可能是个NPC 
  80. class DuanYu extends Role 
  81.     public function __construct() 
  82.     { 
  83.         $this->_gongfu   = new SixSwordWuGong(); 
  84.         $this->_qinggong = new LingBoQingGong(); 
  85.     } 
  86.     public function name() 
  87.     { 
  88.         echo "段誉\n"
  89.     } 
  90.  
  91. // 好吧,这个不是NPC,这是玩家角色,刚开始什么功夫都没有 
  92. class FanXing extends Role 
  93.     public function name() 
  94.     { 
  95.         echo "凡星\n"
  96.     } 
  97.  
  98. // 测试 
  99.  
  100. // 萧大侠先来一段 
  101. $Role = new XiaoFeng(); 
  102. $Role->name(); 
  103. $Role->performQingGong(); 
  104. $Role->performGongFu(); 
  105.  
  106. // 凡星大侠再来一段,有连击的哟 
  107. $Role = new FanXing(); 
  108. $Role->name(); 
  109. $Role->setQingGong(new LingBoQingGong()); 
  110. $Role->setGongFu(new SixSwordWuGong()); 
  111. $Role->performQingGong(); 
  112. $Role->performGongFu(); 
  113. $Role->setGongFu(new XiangLongWuGong()); 
  114. $Role->performGongFu(); 

 

看看都输出了些啥:


  1. 萧峰 
  2. 施展了轻功 
  3. 施展了降龙十八掌 
  4. 凡星 
  5. 施展了凌波微步 
  6. 施展了六脉神剑 
  7. 施展了降龙十八掌 

总结一下:

策略模式定义了一系列的算法(各种武功,轻功,都是算法),并将每一个算法封装起来(武功,轻功都是各自独立的类),而且使它们还可以相互替换(武功可以互换,轻功也可以,想换就换)。策略模式让算法独立于使用它的客户而独立变化(当我们想更改武功或轻功的表现或数值时只需要更改相应的类就可以了,不会影响调用,我们调用功夫的方法始终是performGongFu)










本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1033966,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注