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

简介:

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

举一个武侠的例子:

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

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

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

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

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

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

 
 
  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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
55 4
|
13天前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
51 1
|
2月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
45 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
52 2
|
3月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
47 3
|
3月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
39 2
|
3月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
38 2
|
3月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
29 0