设计模式---策略模式Strategy(对象行为型)

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 ?>   
View Code

 

 

posted @ 2014-06-06 15:49  飛雲若雪  阅读(452)  评论(0编辑  收藏  举报