定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
策略模式(Strategy Pattern)
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
如何解决:将这些算法封装成一个一个的类,任意地替换。
注意:策略模式仅仅封装算法,但策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。将算法的责任和本身进行解耦。
优点:
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点:
1、策略类会增多。
2、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
关键代码:实现同一个接口。
示例代码:
策略接口:Strategy
interface Strategy {
abstrasct function discount($base_price);
}
具体策略:
//会员打折
class VipStrategy implements Strategy{
public function discount($base_price) {
return 0.88 * $base_price;
}
}
//春节活动打折
class SpringStrategy implements Strategy{
public function discount($base_price) {
return 0.9 * $base_price;
}
}
//双11活动打折
class EleventStrategy implements Strategy{
public function discount($base_price) {
return 0.7 * $base_price;
}
}
策略切换类:Context
class Context {
private $strategy;
public function __construct(Strategy $strategy) {
$this->strategy = $strategy;
}
public function discount($base_price){
return $this->strategy->discount($base_price);
}
}
测试:Clienter
$context = new Context(new EleventStrategy());
$context->discount($base_price);
$context = new Context(new VipStrategy());
$context->discount($base_price);
策略模式和工厂方法模式的差别
-
用途不一样
工厂是创建型模式,它的作用就是创建对象;
策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为 -
关注点不一样
一个关注对象(类型)创建
一个关注行为(算法)的封装 -
解决不同的问题
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。 -
工厂相当于黑盒子,策略相当于白盒子
网友评论