php 设计模式之策略者模式

  1 <?php
  2 header('Content-Type:text/html;charset=utf-8');
  3 /**
  4  * 策略模式演示代码
  5  *
  6  * 为了更好地突出“策略”,我们这里以出行为例演示,日常出行大概分为以下几种工具:自驾车,公交车,地铁,火车,飞机,轮船
  7  * 结构:
  8  *    抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  9  *    具体策略角色:包装了相关的算法和行为。
 10  *    环境角色:持有一个策略类的引用,最终给客户端调用。
 11  * 应用场景:
 12  *          抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
 13  *          具体策略角色:包装了相关的算法和行为。
 14  *          环境角色:持有一个策略类的引用,最终给客户端调用。
 15  * 步骤:
 16  *      定义抽象角色类(定义好各个实现的共同抽象方法)
 17  *      定义具体策略类(具体实现父类的共同方法)
 18  *      定义环境角色类(接收保存实例,统一执行策略类接口方法)
 19  *
 20  * 下面一起看代码,领会何为策略模式
 21  */
 22 
 23 /**
 24  * Interface Travel 抽象策略角色
 25  * 约定具体方法
 26  */
 27 interface Travel
 28 {
 29     public function go();
 30 }
 31 
 32 /**
 33  * Class selfDriving 具体策略角色
 34  * 自驾车
 35  */
 36 class bySelfDriving implements Travel
 37 {
 38     public function go()
 39     {
 40         echo '我自己开着车出去玩<br>';
 41     }
 42 }
 43 
 44 /**
 45  * Class byBus具体策略角色
 46  * 乘公交
 47  */
 48 class byBus implements Travel {
 49     public function go()
 50     {
 51         echo '我乘公交出去玩<br>';
 52     }
 53 }
 54 
 55 /**
 56  * Class byMetro 具体策略角色
 57  * 乘地铁
 58  */
 59 class byMetro implements Travel
 60 {
 61     public function go()
 62     {
 63         echo '我乘地铁出去玩<br>';
 64     }
 65 }
 66 
 67 /**
 68  * Class byTrain 具体策略角色
 69  * 乘火车
 70  */
 71 class byTrain implements Travel
 72 {
 73     public function go()
 74     {
 75         echo '我乘火车出去玩<br>';
 76     }
 77 }
 78 
 79 /**
 80  * Class byAirplane 具体策略角色
 81  * 乘飞机
 82  */
 83 class byAirplane implements Travel
 84 {
 85     public function go()
 86     {
 87         echo '我乘飞机出去玩<br>';
 88     }
 89 }
 90 
 91 /**
 92  * Class bySteamship 具体策略角色
 93  * 乘轮船
 94  */
 95 class bySteamship implements Travel
 96 {
 97     public function go()
 98     {
 99         echo '我乘轮船出去玩<br>';
100     }
101 }
102 
103 /**
104  * Class Mine 环境角色
105  */
106 class Mine{
107     private $_strategy;
108     private $_isChange = false;
109 
110     /**
111      * 构造方法
112      * 此处使用到了依赖注入和类型约束的概念,详情请参考
113      *
114      * @param Travel $travel
115      */
116     public function __construct(Travel $travel)
117     {
118         $this->_strategy = $travel;
119     }
120 
121     /**
122      * 改变出行方式
123      *
124      * @param Travel $travel
125      */
126     public function change(Travel $travel)
127     {
128         $this->_strategy = $travel;
129         $this->_isChange = true;
130     }
131 
132     public function goTravel()
133     {
134         if ($this->_isChange) {
135             echo '现在改变主意,';
136             $this->_strategy->go();
137         } else {
138             $this->_strategy->go();
139         }
140 
141     }
142 }
143 
144 /**
145  * 客户端使用
146  */
147 $strategy = new Mine(new byBus());
148 // 乘公交
149 $strategy->goTravel();
150 // 乘地铁
151 $strategy->change(new byMetro());
152 $strategy->goTravel();
153 // 自驾车
154 $strategy->change(new bySelfDriving());
155 $strategy->goTravel();
156 
157 //打印:
158 //我乘公交出去玩
159 //现在改变主意,我乘地铁出去玩
160 //现在改变主意,我自己开着车出去玩

 

posted @ 2018-08-01 10:40  大雾哥  阅读(264)  评论(0编辑  收藏  举报