设计模式(十三):策略模式

2019-05-16  本文已影响0人  何笙

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

策略模式(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);

策略模式和工厂方法模式的差别

上一篇 下一篇

猜你喜欢

热点阅读