1.定义:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,称为策略模式
2. 使用策略模式可以实现ioc(控制反转),降低依赖注入
3. 如下面这个例子,如果不使用策略类,那么我们会使用if else或者switch这种控制结构来判断吃的食物,从而调用所选食物的处理方法,当我们增加一种食物时,需要对原本的代码新增加一个判断逻辑,此种方式我们称之为硬编码,应该避免
<?php
/**
*
* @authors mtg
* @date 2015-08-07 15:00:54
*/
/**
* 策略接口类:具体策略类需要实现其中的方法
*/
interface Eat{
public function eat();
}
/**
* 具体策略类:吃米饭
*/
class eatRice implements Eat
{
public function eat()
{
echo "eat rice";
}
}
/**
* 具体的策略类:吃面包
*/
class eatBread implements Eat
{
public function eat()
{
echo "eat bread";
}
}
/**
* 具体的策略类:吃面条
*/
class eatNoodles implements Eat{
public function eat()
{
echo "eat noodles";
}
}
/**
* 策略解决类: 以提供客户选择使用何种解决方案:
*/
class ChooseEat
{
private $strategy=null;
public function __construct(Eat $eat)
{
$this->strategy=$eat;
}
public function eat_food()
{
$this->strategy->eat();
}
public function set_eat_strategy(Eat $eat)
{
$this->strategy=$eat;
}
}
$chooseEat=new ChooseEat(new eatBread());
$chooseEat->eat_food();//eat bread
与工厂类的区别:
工厂模式是创建型模式 ,它关注对象创建,提供创建对象的接口. 让对象的创建与具体的使用客户无关。
策略模式是对象行为型模式 ,它关注行为和算法的封装 。它定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化