策略模式的优点:
策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能。策略模式的另一个优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
说了这么多,策略模式究竟解决的是什么问题呢?
策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
在基本策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。
策略模式的结构图:
代码演示
<?php
/**
* 有一个抽象类约束行为
* 有多个实现类继承抽象类处理具体逻辑
* 有策略分配类做转发
*/
abstract class Lunch
{
abstract function buy();
abstract function eat();
}
class Rice extends Lunch
{
public function buy()
{
echo "It cost 8 yuan </br>";
}
public function eat()
{
echo "I had rice at noon </br>";
}
}
class Noodles extends Lunch
{
public function buy()
{
echo "It cost 12 yuan </br>";
}
public function eat()
{
echo "I had noodles at noon </br>";
}
}
class Choose
{
private $strategy;
public function __construct($strategy)
{
$this->strategy = $strategy;
}
public function buy()
{
$this->strategy->buy();
}
public function eat()
{
$this->strategy->eat();
}
}
$today = new Choose(new Noodles());
$today->buy();
$today->eat();
$yesterday = new Choose(new Rice());
$yesterday->buy();
$yesterday->eat();
输出结果