策略模式跟工厂模式有个共同点就是扩展性好,工厂模式就不多说了(参考前面的工厂模式),策略模式主要解决的问题是:有多种策略可以选择,根据不同的情况选择不同的策略,可以随意的增加策略,而不用去修改使用策略的中间模块。比如说,工资计算,由于公司里有各个层次的员工计算工资的公式是不一样的,那么财务部会根据不同的员工来选择不同的计算公式。策略模式就是用来解决这类的问题,下面看看例子:
<?php
abstract class SalaryAbs
{
public function calculate(){}
}
class HighSalary extends SalaryAbs
{
public function calculate()
{
echo "HighSalary!<BR>";
}
}
class LowSalary extends SalaryAbs
{
public function calculate()
{
echo "LowSalary!<BR>";
}
}
class Accountant
{
public function cal($salary)
{
$salary->calculate();
}
}
$accountant = new Accountant();
$accountant->cal(new HighSalary());
$accountant->cal(new LowSalary);
?>
这样财务部的同事就可以通过选择不同的员工计算方式来结算员工的工资了。策略模式在很多情况下也会用到,特别是在种类繁多的选择,还要根据不同选择得到不同结果。大概的策略模式就是这样的了。