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