策略模式说明

定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化。

说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用它;策略模式作用在于,行为实现的不可预见,面对这样的一种变化,我们得思考如何使用程序好维跟扩展,并使得客户很好的使用算法的方式;

策略模式 使用要注意它 "变化" 的一面,策略模式就是来解决这个 变化 问题的。

比如商场买卖的价格或促销问题,如果不使用模式,就可能只是 把“所有”的情况用 if else 类似“硬编码” 的开式写在一起,或是传个传个参数,稍加点内部逻辑代码,最好就是一同写在一个类里面;

P如:

function Price(personType, price) {//大客户 5 折if (personType == 'vip') {return price * 0.5;} else if (personType == 'old'){ //老客户 3 折return price * 0.3;} else {return price; //其他都全价
    }
}

我们把上面的看成一个类,如果要扩展一种价格手段,就得在 Price 里添加新的 else if,或是修改某个算法逻辑,就得某个 if 或 else if 里修改, 这是对单个类的修改,而且这种情况势必得经常修改这个类,这违反了设计模式的一个原则:对修改关闭,对扩展开放的原则;

而且这些算法,在不同客户面前可能会经常替换,固定参数也不能满足需求;

解决这种问题就可以使用策略模式,策略在于关注变化,把各行为不同的实现各自封装起来,比如要实现一只动物,走路,叫声,吃东西的各种表现,就可以把走路,叫声,吃东西,就可以定义三个接口抽象,然后把他们各自具体实现去实现三个接口;

前面说,策略模式是使算法可独立于使用的客户的改变,所以策略模式里,一般是在客户端定义选择使用的算法,传入相应的参数,再根据算法返回结果;

策略模式结构图:

这种有点类似简单工厂模式,这种再加层 Context 是为了客户使用起来更简单调用,不必自处理一些逻辑,让团队开发,更趋一致;Context 也可以做成一个基类,其下可以有多个实现子类继承;

Context 跟 Client 可以改为:

继承子类只需引用自己的实现接口算法,即可,这样客户可以更简单的调用,也不必理会各种动物使用什么接口,是怎么实现的了;

实例源码

这里以上面的商场价格手段来实现:

1. 实现几种算法,Javascript是弱类型,没有接口这号东西,就是直接写了;

vip 客户

function vipPrice() {this.discount = 0.5;
}vipPrice.prototype.getPrice = function(price) {  return price * this.discount;
}

老客户:

function oldPrice() {this.discount = 0.3;
}oldPrice.prototype.getPrice = function(price) {return price * this.discount;
}

普通客户

function Price() {this.discount = 1;
}Price.prototype.getPrice = function(price) {return price ;
}

2. 上下文:

function Context() {this.name = '';this.strategy = null;this.price = 0;
}Context.prototype.set = function(name, strategy, price) {this.name = name;this.strategy = strategy;this.price = price;
}Context.prototype.getResult = function() {console.log(this.name + ' 的结账价为: ' + this.stragegy.getPrice(this.price));
}

3. 客户端使用;

// 上下文
var context = new Context();//vip客户
var vip = new vipPrice();
context.set ('vip客户', vip, 200);
context.getPrice();//老客户
var old = new oldPrice();
context.set ('老客户', old, 200);
context.getPrice();//普通客户
//...

这样即使得 客户 与算法解藕,又使得修改跟扩展能独立的进行,不影到客户端或其他算法的使用;

其他说明

策略模式是一个非常实用跟常用的设计模式,普通用于商场价格,促销等场景,他跟工厂模式很像,可以说是他的一种升级版本;

策略模式相关模式:工厂模式,组合模式;

关健字:算法,变化,封装,上下文;

转载于:https://www.cnblogs.com/editor/p/4272655.html

[设计模式] javascript 之 策略模式相关推荐

  1. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  2. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  3. 设计模式 之美 -- 策略模式

    策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...

  4. Java设计模式之十一 ---- 策略模式和模板方法模式

    前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...

  5. 《研磨设计模式》chap17 策略模式(2) 总结

    1. 新增加context 上下文类 eg. 发工资:发人民币和发美元 public interface PaymentStrategy {//公司给某人真正支付工资 public void pay( ...

  6. 设计模式のStrategyPattern(策略模式)----行为模式

    一.问题产生背景 当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理.这些处理和客户端无关,我们可以把这些算法 ...

  7. LOL设计模式之「策略模式」

    之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...

  8. 从王者荣耀看设计模式(一.策略模式)

    从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...

  9. 《设计模式》之策略模式

    一.什么是策略模式? 比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略. 1.1.策略模式结构 ...

最新文章

  1. 在CentOS 6.9上从源码安装Go 1.10
  2. 找子串替换(kmp)poj1572
  3. every day english
  4. java反序列化 exp_java反序列化-ysoserial-调试分析总结篇(4)
  5. 107.网络服务质量包括哪些(QoS)
  6. hdu4091(暴力)
  7. linux同步硬件和系统时钟,liunx系统下时钟不同步会出现问题 怎么同步Linux 的系统时钟和硬件时钟?...
  8. 切图崽的自我修养-规范CSS元素命名
  9. Web3.0 兴起之际,元宇宙这杯羹怎么分?
  10. 华为智慧屏鸿蒙挂安卓9,荣耀先行!华为智慧屏9月发布:搭鸿蒙系统和自研芯片...
  11. 萌新向Python数据分析及数据挖掘 第二章 pandas 第二节 Python Language Basics, IPython, and Jupyter Notebooks...
  12. Java学习笔记-1.简介
  13. NIPS论文遭受全面质疑:论证过程普遍不完整,又何谈对错?
  14. php处理管道文件流
  15. 3.MongoDB uri中包含特殊字符与读策略配置
  16. fileboy v1.9 发布,文件变更监听通知系统
  17. Netty 是什么,Netty原理详解
  18. 解决谷歌Chrome浏览器默认主页被毒霸篡改的问题
  19. 视觉显著性python_OpenCV中的显著性检测(Saliency Detection)
  20. Mars3D(含Cesium)数据及服务篇:发布三维数据服务

热门文章

  1. Codeforces 558(C、D、E)总结
  2. Netflix工程总监眼中的分类算法:深度学习优先级最低
  3. Fastdfs分布式文件系统的应用
  4. Android动画类型
  5. linux基础(十一)--系统初始化的简谈
  6. Oracle收购Sun消化不良 Sun赢利困难 MySQL将何去何从
  7. Vue中的三种Watcher
  8. ansible 容器部署_使用ansible-bender工具构建容器图像
  9. 如何使用PerfSONAR测试网络
  10. dhh basecamp_使Basecamp的薪酬透明化保留了人才