策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。

也就是我们打算出行旅游,我们可以有几个策略可以考虑,可以骑自行车,汽车,做火车,飞机。

 

【策略模式中主要角色】

环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。(出去旅游(接口类或抽象类)必须考虑交通工具,交通工具要考虑时间(接口类或抽象类要实现的方法),费用等问题)
抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。(环境类的实现,选择交通工具范围,火车,飞机,自行车。。。)
具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。(给出我们选择交通方式的信息)

 

 

【策略模式PHP示例】

# 环境类(Context)
interface TravelTool{
    public function useTime();
    public function money();
}
 
# 抽象策略类(Strategy)
 
class Plane implements TravelTool {  # 飞机
    public function useTime()
    {
        return  '1 h';
    }
 
    public function  money()
    {
        return '$10';
    }
}
 
class Train implements TravelTool {  # 火车
    public function useTime()
    {
        return  '3 h';
    }
 
    public function  money()
    {
        return '$5';
    }
}
 
# 具体策略类(ConcreteStrategy)
 
class doTravel{
    public $obj;
 
    public function __construct($method)
    {
        $temp = new ReflectionClass($method);     
        $this->obj = $temp->newInstance();
    }
 
    public function money(){
        echo $this->obj->money();
    }
 
    public function useTime(){
        echo $this->obj->useTime();
    }
}
 
$obj = new doTravel('Train');
$obj->money();
echo "<br/>";
$obj->useTime()