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

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

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

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

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 01.模式定义 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择...
    Java技术范阅读 371评论 0 0
  • javascript设计模式与开发实践 设计模式 每个设计模式我们需要从三点问题入手: 定义 作用 用法与实现 单...
    穿牛仔裤的蚊子阅读 4,489评论 0 13
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 8,130评论 2 17
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 4,081评论 3 14
  • 0.提前说明 模式选择的方法1)模式的功能——看是否能解决问题2)模式的本质——看模式是否主要用来解决这类问题3)...
    王侦阅读 1,258评论 0 1

友情链接更多精彩内容