设计模式之策略模式

Posted: 2015-10-12  By  vilay  |  Views(1374)

策略模式:定义了算法家族,将不同的算法封装具有共同接口的不同的类中,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户

应用场景:超市经常根据节日举办各种活动,做打折活动,或者满多少减多少,赠送积分等,都是一系列的算法可以用策略模式实现,减少代码的维护成本。还有电商网站中根据用户的特性,而展现不同的商品等等场景。

首先定义共同接口:

interface Strategy {
    public function algorithmInterface();
}

定义不同的实现:

//算法A的实现
class AlgorithmA implements Strategy {

        public function algorithmInterface()
        {
                echo '算法A的实现';
        }
    }

//算法B的实现
class AlgorithmB implements Strategy {
        public function algorithmInterface()
        {
                echo '算法B的实现';
        }
    }

//算法C的实现
class AlgorithmC implements Strategy {

        public function algorithmInterface()
        {
                echo '算法C的实现';
        }
    }

用一个类来维护对Strategy对象的引用:

class Context {

protected $Strategy = null;

//增加类型提示 非Strategy 对象无法传入
public function setStrategy(Strategy $strategy)
{
    $this->strategy = $strategy;
}

public function useAlgorithm()
{
    $this->strategy->algorithmInterface();
}

}

客户端代码:

//客户端代码
$context = new Context;

$where = 'A';

if ($where === 'A') {

        $context->setStrategy(new AlgorithmA());

} elseif ($where === 'B') {

        $context->setStrategy(new AlgorithmB);

} elseif ($where === 'C') {

        $context->setStrategy(new AlgorithmC);

}

$context->useAlgorithm();