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

举一个武侠的例子:

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

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

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

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

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

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

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

看看都输出了些啥:

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

总结一下:

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

转载于:https://blog.51cto.com/ustb80/1033966

设计模式学习笔记(5) - 策略模式相关推荐

  1. C++设计模式学习笔记:策略模式

    C++设计模式学习笔记:策略模式 策略模式设计商场促销 1.策略模式介绍 2.商场收银系统策略模式实现 3.策略模式与工厂模式结合 3.策略模式与工厂模式对比 策略模式设计商场促销 1.策略模式介绍 ...

  2. 设计模式学习笔记--Strategy 策略模式

    所谓策略模式(Strategy Pattern),就是将策略 (算法) 封装为一个对象,易于相互替换,如同 USB 设备一样可即插即用:如果将策略.具体的算法和行为,编码在某个类或客户程序内部,将导至 ...

  3. Head First 设计模式学习笔记 一 策略模式

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 这是一个比较简单的模式,核心的思想就是将应用中的变化之处独立出来,这样就可以 ...

  4. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  5. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  6. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  7. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  8. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  9. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

最新文章

  1. 3D目标检测论文阅读摘要
  2. CNS接连发文背书,原来生姜这么神奇
  3. WCF系列之.net(4.0) 在网站使用Js调用Wcf Rest
  4. Python 中strip()方法怎么用?
  5. 在日常办公能做什么_日常生活中电烤箱能烤制什么美食呢?
  6. 学计算机要买什么样的电脑,大学开学要买电脑吗?又要买什么样的电脑?看准这些再买也不迟!...
  7. 在 Tomcat 中设置 JDBCRealm
  8. Windows server 2008 R2 服务器安装 MySql 5.6.36 64位绿色版 报系统错误1067
  9. 实验6.1 定义一个基类Animal
  10. mongodb和mysql空间占用_MongoDB的存储结构及对空间使用率的影响
  11. html滚动字幕制作教程,dreamweaver教程:怎么制作网页滚动字幕
  12. Vue组件通信(父传子、子传父、兄弟传值)
  13. C#-Winform - 调用笔记本摄像头实现拍照并保存
  14. 给函数取一个“好”名字
  15. Python之路—200行Python代码搞了个打飞机游戏!!
  16. 区间类动态规划(dp)
  17. Redis 如何实现库存扣减操作和防止被超卖?
  18. 中国 A 股纳入 MSCI
  19. 95后二本生争抢互联网职位:工资高福利好,为了改变命运背水一战
  20. 2022年汽车计算和人工智能技术(英) PPT

热门文章

  1. 配置Voice vlan
  2. 利用思科 Webex中的3个漏洞,以 ghost 用户身份参会
  3. PHP如何获取txt中的文字
  4. 58、什么是断言?应用场景?
  5. java生成自定义标志、大小的二维码
  6. exchange 2010 允许 relay设定
  7. Python实战之多线程编程thread模块
  8. RHEL5.4 x86_64 GCC 4.1.2 升级到4.7.0版过程(含安装MPFR、GMP、MPC过程)
  9. Ubuntu 12.04 更新重启无法进入桌面 -转
  10. 蓝桥杯 ALGO-39 算法训练 数组排序去重