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 //现在改变主意,我自己开着车出去玩