美文网首页
设计模式(十三):策略模式

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

作者: 何笙 | 来源:发表于2019-05-16 19:40 被阅读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);

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

  • 用途不一样
    工厂是创建型模式,它的作用就是创建对象;
    策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为

  • 关注点不一样
    一个关注对象(类型)创建
    一个关注行为(算法)的封装

  • 解决不同的问题
    工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
    策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。

  • 工厂相当于黑盒子,策略相当于白盒子

相关文章

网友评论

      本文标题:设计模式(十三):策略模式

      本文链接:https://www.haomeiwen.com/subject/wlnraqtx.html