PHP设计模式之 策略模式Strategy详解【对象行为型(3)


2 ) Strategy和Context之间的通信开销 :无论各个ConcreteStrategy实现的算法是简单还是复杂, 它们都共享Strategy定义的接口。因此很可能某些 ConcreteStrategy不会都用到所有通过这个接口传递给它们的信息;简单的 ConcreteStrategy可能不使用其中的任何信息!这就意味着有时Context会创建和初始化一些永远不会用到的参数。如果存在这样问题 , 那么将需要在Strategy和Context之间更进行紧密的耦合。
3 )策略模式将造成产生很多策略类:可以通过使用享元模式在一定程度上减少对象的数量。 增加了对象的数目 Strategy增加了一个应用中的对象的数目。有时你可以将 Strategy实现为可供各Context共享的无状态的对象来减少这一开销。任何其余的状态都由 Context维护。Context在每一次对Strategy对象的请求中都将这个状态传递过去。共享的 Strategy不应在各次调用之间维护状态。

8.实现

1)出行旅游:

uml:

代码实现:

<?php
/**
* 策略模式
* 定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化
*
*/ 
 
/**
* 出行旅游
*
* 
*/
interface TravelStrategy{
 public function travelAlgorithm();
} 
 
/**
 * 具体策略类(ConcreteStrategy)1:乘坐飞机
 */
class AirPlanelStrategy implements TravelStrategy {
 public function travelAlgorithm(){
 echo "travel by AirPlain", "<BR>\r\n"; 
 }
} 
 
/**
 * 具体策略类(ConcreteStrategy)2:乘坐火车
 */
class TrainStrategy implements TravelStrategy {
 public function travelAlgorithm(){
 echo "travel by Train", "<BR>\r\n"; 
 }
} 
 
/**
 * 具体策略类(ConcreteStrategy)3:骑自行车
 */
class BicycleStrategy implements TravelStrategy {
 public function travelAlgorithm(){
 echo "travel by Bicycle", "<BR>\r\n"; 
 }
} 
/**
 * 
 * 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
 * 算法解决类,以提供客户选择使用何种解决方案:
 */
class PersonContext{
 private $_strategy = null;
 
 public function __construct(TravelStrategy $travel){
 $this->_strategy = $travel;
 }
 /**
 * 旅行
 */
 public function setTravelStrategy(TravelStrategy $travel){
 $this->_strategy = $travel;
 }
 /**
 * 旅行
 */
 public function travel(){
 return $this->_strategy ->travelAlgorithm();
 }
} 
 
// 乘坐火车旅行
$person = new PersonContext(new TrainStrategy());
$person->travel();
 
// 改骑自行车
$person->setTravelStrategy(new BicycleStrategy());
$person->travel();
 
?> 

2)排序策略:某系统提供了一个用于对数组数据进行操作的类,该类封装了对数组的常见操作,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/3907.html