我一直觉得策略模式是一个很好玩的模式,让我们用游戏来了解一下。
举一个武侠的例子:
小说中大侠一般都有两样功夫:
第一:武功
第二:轻功
说到武功,让我们看看天龙八部里的三位高手的绝招:
萧峰:降龙十八掌
虚竹:北冥神功,天山折梅手,天山六阳掌,生死符
段誉:六脉神剑
再看看轻功:
萧峰:普通轻功
虚竹:普通轻功
段誉:凌波微步
我们想在游戏里创建一个角色,叫萧峰。
让他施展轻功跟段誉比比脚力,再使武功和段誉比比
我们还想创建一个新角色,叫凡星
凡星施展了一段凌波微步,再施展了一招六脉神剑,再一招降龙十八掌,将一只蚊子击落掌下
好吧,想像力总是无限的,让我们来看一下程序怎么来实现,看代码:
- // 武功接口
- interface WuGong
- {
- public function perform();
- }
- // 传说中的降龙十八掌,威力不俗
- class XiangLongWuGong implements WuGong
- {
- public function perform()
- {
- echo "施展了降龙十八掌\n";
- }
- }
- // 远程攻击的六脉神剑,一般说来,远程攻击的伤害都不高
- class SixSwordWuGong
- {
- public function perform()
- {
- echo "施展了六脉神剑\n";
- }
- }
- // -------------------------------------------------------------
- // 轻功接口
- interface QingGong
- {
- public function perform();
- }
- class CommonQingGong implements QingGong
- {
- public function perform()
- {
- echo "施展了轻功\n";
- }
- }
- class LingBoQingGong implements QingGong
- {
- public function perform()
- {
- echo "施展了凌波微步\n";
- }
- }
- // -------------------------------------------------------------
- // 人物,因为施展功夫是天生的属性,所以不用接口用抽象
- abstract class Role
- {
- // 人物有两个属性,一个是功夫,一个是轻功
- protected $_gongfu;
- protected $_qinggong;
- public abstract function name();
- public function performGongFu()
- {
- $this->_gongfu->perform();
- }
- public function performQingGong()
- {
- $this->_qinggong->perform();
- }
- public function setGongFu($gongfu)
- {
- $this->_gongfu = $gongfu;
- }
- public function setQingGong($qinggong)
- {
- $this->_qinggong = $qinggong;
- }
- }
- // 萧峰,这个可能是个NPC
- class XiaoFeng extends Role
- {
- public function __construct()
- {
- $this->_gongfu = new XiangLongWuGong();
- $this->_qinggong = new CommonQingGong();
- }
- public function name()
- {
- echo "萧峰\n";
- }
- }
- // 段誉,这个也可能是个NPC
- class DuanYu extends Role
- {
- public function __construct()
- {
- $this->_gongfu = new SixSwordWuGong();
- $this->_qinggong = new LingBoQingGong();
- }
- public function name()
- {
- echo "段誉\n";
- }
- }
- // 好吧,这个不是NPC,这是玩家角色,刚开始什么功夫都没有
- class FanXing extends Role
- {
- public function name()
- {
- echo "凡星\n";
- }
- }
- // 测试
- // 萧大侠先来一段
- $Role = new XiaoFeng();
- $Role->name();
- $Role->performQingGong();
- $Role->performGongFu();
- // 凡星大侠再来一段,有连击的哟
- $Role = new FanXing();
- $Role->name();
- $Role->setQingGong(new LingBoQingGong());
- $Role->setGongFu(new SixSwordWuGong());
- $Role->performQingGong();
- $Role->performGongFu();
- $Role->setGongFu(new XiangLongWuGong());
- $Role->performGongFu();
看看都输出了些啥:
- 萧峰
- 施展了轻功
- 施展了降龙十八掌
- 凡星
- 施展了凌波微步
- 施展了六脉神剑
- 施展了降龙十八掌
总结一下:
策略模式定义了一系列的算法(各种武功,轻功,都是算法),并将每一个算法封装起来(武功,轻功都是各自独立的类),而且使它们还可以相互替换(武功可以互换,轻功也可以,想换就换)。策略模式让算法独立于使用它的客户而独立变化(当我们想更改武功或轻功的表现或数值时只需要更改相应的类就可以了,不会影响调用,我们调用功夫的方法始终是performGongFu)
本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1033966,如需转载请自行联系原作者