策略模式在于定义一系列的算法,并把它们封装起来,算法可以自由添加和替换,符合开闭原则,它降低了算法与具体的业务逻辑的耦合性。它还有一个优点是避免了代码中一些条件判断语句,当代码中出现了太多得判断语句的时候也可以考虑一下是否可以用策略模式。
策略模式UML类图:
ZF中代码实例:(再看一下 这个更像是观察者模式...)
class Zend_Filter implements Zend_Filter_Interface
{
...
protected $_filters = array();
...
/**
* Adds a filter to the chain
*
* @param Zend_Filter_Interface $filter
* @param string $placement
* @return Zend_Filter Provides a fluent interface
*/
public function addFilter(Zend_Filter_Interface $filter, $placement = self::CHAIN_APPEND)
{
if ($placement == self::CHAIN_PREPEND) {
array_unshift($this->_filters, $filter);
} else {
$this->_filters[] = $filter;
}
return $this;
}
/**
* Add a filter to the end of the chain
*
* @param Zend_Filter_Interface $filter
* @return Zend_Filter Provides a fluent interface
*/
public function appendFilter(Zend_Filter_Interface $filter)
{
return $this->addFilter($filter, self::CHAIN_APPEND);
}
/**
* Add a filter to the start of the chain
*
* @param Zend_Filter_Interface $filter
* @return Zend_Filter Provides a fluent interface
*/
public function prependFilter(Zend_Filter_Interface $filter)
{
return $this->addFilter($filter, self::CHAIN_PREPEND);
}
/**
* Get all the filters
*
* @return array
*/
public function getFilters()
{
return $this->_filters;
}
/**
* Returns $value filtered through each filter in the chain
*
* Filters are run in the order in which they were added to the chain (FIFO)
*
* @param mixed $value
* @return mixed
*/
public function filter($value)
{
$valueFiltered = $value;
foreach ($this->_filters as $filter) {
$valueFiltered = $filter->filter($valueFiltered);
}
return $valueFiltered;
}
...
}