PHP设计模式-策略模式 Strategy

PHP策略设计模式(Strategy) 定义一组的算法,把每一个算法封装到实现同一接口的不同的独立类中,从而使它们可以快速切换。这种策略设计模式使得算法可以在不影响到客户端的情况下发生变化。这也是除了通过继承抽象类之外实现多样性类的一种不错的选择。

应用场景比如对一系列的对象的排序,一种策略是根据时间,其他策略还有根据id等其他条件。PHP项目开发环境切换如生产环境还是开发环境。下面是根据日期或id进行对象比较的PHP代码示例:

// 同一接口,比较
interface 
{
    public function compare($a, $b);
}
// 日期策略
class DateComparator implements ComparatorInterface
{
    public function compare($a, $b)
    {
        $aDate = new DateTime($a['date']);
        $bDate = new DateTime($b['date']);

        if ($aDate == $bDate) {
            return 0;
        } else {
            return $aDate < $bDate ? -1 : 1;
        }
    }
}
// ID 策略
class IdComparator implements ComparatorInterface
{
    public function compare($a, $b)
    {
        if ($a['id'] == $b['id']) {
            return 0;
        } else {
            return $a['id'] < $b['id'] ? -1 : 1;
        }
    }
}
// 对象集合类
class ObjectCollection
{
    private $elements;

    private $comparator;

    public function __construct(array $elements = array())
    {
        $this->elements = $elements;
    }
    
    // 设置策略
    public function setComparator(ComparatorInterface $comparator)
    {
        $this->comparator = $comparator;
    }

    public function sort()
    {
        if (!$this->comparator) {
            throw new Exception("Comparator is not set");
        }

        $callback = array($this->comparator, 'compare');
        uasort($this->elements, $callback); // 根据自定义函数排序

        return $this->elements;
    }

}
// 客户端调用
$collection = array(array('date' => '2014-02-03'), 
    array('date' => '2013-02-01'), array('date' => '2015-02-02'));
$obj = new ObjectCollection($collection);
$obj->setComparator(new DateComparator());
$elements = $obj->sort();
$firstElement = array_shift($elements);
echo $firstElement;

Leave a Reply

Your email address will not be published. Required fields are marked *