1 策略模式简介
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
2 模式组成
1)抽象策略角色(Strategy):
策略类,通常由一个接口或者抽象类实现。
2)具体策略角色(ConcreteStrategy):
包装了相关的算法和行为。
3)环境角色(Context):
持有一个策略类的引用,最终给客户端调用。
3 模式核心思想
策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类的耦合。命令模式的算法是相互独立的,每个命令做的工作是不同的。而策略模式却是在做同一种工作。
4 模式架构图
5 程序架构
1) 抽象策略(Strategy)
// 定义接口,定义了要实现的策略算法
interface IStrategy{
// 算法方法
public function doFunction();
}
2) 具体策略(ConcreteStrategy)
// 具体A策略
class ConcreteStrategyA implements IStrategy{
public function doFunction(){
echo '算法A实现';
}
}
// 具体B策略
class ConcreteStrategyB implements IStrategy{
public function doFunction(){
echo '算法B实现';
}
}
// 具体C策略
class ConcreteStrategyC implements IStrategy{
public function doFunction(){
echo '算法C实现';
}
}
3)环境类(Context)
// 环境类,维护一个Strategy应用
class Context{
// 策略
private $_strategy = null;
public function __construct(IStrategy $strategy){
$this->_strategy = $strategy;
}
public function doWork(){
return $this->_strategy->doFunction();
}
}
4)客户端(Client)
// 客户端类
class Client{
public function main($data){
// A策略
$context = new Context(new ConcreteStrategyA());
$context->doWork();
// B策略
$context = new Context(new ConcreteStrategyB());
$context->doWork();
// C策略