1. 概述
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。
2. 应用场景
(1)多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为。
(2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
(3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
3. 示例
出行旅游:我们可以有几个策略可以考虑:可以骑自行车、汽车、火车、飞机。每个策略都可以得到相同的结果,但是它们使用不同的资源。选择策略的依据是费用、时间、方便程度。
1 <?php
2 /**
3 * 策略模式
4 * 定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化
5 *
6 */
7
8
9 /**
10 * 出行旅游
11 *
12 *
13 */
14 interface TravelStrategy{
15 public function travelAlgorithm();
16 }
17
18
19 /**
20 * 具体策略类(ConcreteStrategy)1:乘坐飞机
21 */
22 class AirPlanelStrategy implements TravelStrategy {
23 public function travelAlgorithm(){
24 echo "travel by AirPlain", "<BR>\r\n";
25 }
26 }
27
28
29 /**
30 * 具体策略类(ConcreteStrategy)2:乘坐火车
31 */
32 class TrainStrategy implements TravelStrategy {
33 public function travelAlgorithm(){
34 echo "travel by Train", "<BR>\r\n";
35 }
36 }
37
38 /**
39 * 具体策略类(ConcreteStrategy)3:骑自行车
40 */
41 class BicycleStrategy implements TravelStrategy {
42 public function travelAlgorithm(){
43 echo "travel by Bicycle", "<BR>\r\n";
44 }
45 }
46
47
48
49 /**
50 *
51 * 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
52 * 算法解决类,以提供客户选择使用何种解决方案:
53 */
54 class PersonContext{
55 private $_strategy = null;
56
57 public function __construct(TravelStrategy $travel){
58 $this->_strategy = $travel;
59 }
60 /**
61 * 旅行
62 */
63 public function setTravelStrategy(TravelStrategy $travel){
64 $this->_strategy = $travel;
65 }
66 /**
67 * 旅行
68 */
69 public function travel(){
70 return $this->_strategy ->travelAlgorithm();
71 }
72 }
73
74 // 乘坐火车旅行
75 $person = new PersonContext(new TrainStrategy());
76 $person->travel();
77
78 // 改骑自行车
79 $person->setTravelStrategy(new BicycleStrategy());
80 $person->travel();
81
82 ?>
设计模式---策略模式Strategy(对象行为型)
时间: 2024-10-27 13:37:23