设计模式之策略模式讲解

  09 Jul 2015


策略模式:

又叫算法簇模式,就是定义了不同的算法簇,并且之间可以相互替换,这种模式让算法的变化独立于使用算法的客户。

背景:

日常开发中我们会遇到类似地情况,实现某一个功能有多种算法,我们需要根据环境或者条件的不同来选择不同的算法和策略来完成。比如说查找,排序等等。一种常见的方法是硬编码(hrad coding)。在一个类中,如果需要提供多种查找算法,可以将算法写到一个类中,然后每个方法对应一种算法,或者直接通过if else 或者switch 来进行选择。这种硬编码的方法维护成本比较高,如果需要添加新的算法,需要修改封装算法类的源码。

解决方案:

定义一系列的算法,把每个算法都封装起来,并且使他们可以相互替换。使得算法可独立于使用它的客户而变化。

下面就用一个网上看到的示例来讲解一下:

出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。

Image

看代码:

//php代码
/** 
* 策略模式 
* 定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化 
* 
*/

/**
 * 出行旅游
 */
interface TravelStrategy{
	public function TravelAlgorithm{}
}

/**
 * 具体策略类 1 乘坐飞机
 */
class AirPlaneStrategy implements TravelStrategy{
	public function TravelAlgorithm{
		echo 'Travel by AirPlane';
	}
}

/**
 * 具体策略类 2 乘坐火车
 */
class TrainStrategy implements TravelStrategy{
	public function TravelAlgorithm{
		echo 'Travel by Train';
	}
}

/**
 * 具体策略类 3 骑自形车
 */
class BicycleStrategy implements TravelStrategy{
	public function TravelAlgorithm{
		echo 'Travel by Bicycle';
	}
}

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();
comments powered by Disqus