[设计模式] javascript 之 策略模式
策略模式说明
定义: 封装一系列的算法,使得他们之间可以相互替换,本模式使用算法独立于使用它的客户的变化。
说明:策略模式,是一种组织算法的模式,核心不在于算法,而在于组织一系列的算法,并且如何去使用它;策略模式作用在于,行为实现的不可预见,面对这样的一种变化,我们得思考如何使用程序好维跟扩展,并使得客户很好的使用算法的方式;
策略模式 使用要注意它 "变化" 的一面,策略模式就是来解决这个 变化 问题的。
比如商场买卖的价格或促销问题,如果不使用模式,就可能只是 把“所有”的情况用 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 之 策略模式相关推荐
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式入门(策略模式)
[0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...
- 设计模式 之美 -- 策略模式
策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换.对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户. 基本的UML类图如下: 用户使用S ...
- Java设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- 《研磨设计模式》chap17 策略模式(2) 总结
1. 新增加context 上下文类 eg. 发工资:发人民币和发美元 public interface PaymentStrategy {//公司给某人真正支付工资 public void pay( ...
- 设计模式のStrategyPattern(策略模式)----行为模式
一.问题产生背景 当我们进行一系列处理时(员工工资核算,会员管理,计算器,优惠活动),会有很多相似的算法和处理过程,只是由于具体的算法的差异,导致必须不同处理.这些处理和客户端无关,我们可以把这些算法 ...
- LOL设计模式之「策略模式」
之前写过一篇什么是「设计模式」?,没有类图,没有代码,有些同学说看不太懂,今天给大家带来策略模式(有图,有码,有真相!). 英雄联盟(LOL) 玩过LOL的同学都知道,LOL有上百个英雄,如果用OO技 ...
- 从王者荣耀看设计模式(一.策略模式)
从王者荣耀看设计模式(策略模式) 一:简介 游戏开始前,玩家需要选择英雄,再根据所选择的阵容自由选择召唤师技能,游戏开始,玩家可以控制英雄进行普通攻击和使用召唤师技能攻击 二:策略模式 策略模式将可变 ...
- 《设计模式》之策略模式
一.什么是策略模式? 比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略. 1.1.策略模式结构 ...
最新文章
- 在CentOS 6.9上从源码安装Go 1.10
- 找子串替换(kmp)poj1572
- every day english
- java反序列化 exp_java反序列化-ysoserial-调试分析总结篇(4)
- 107.网络服务质量包括哪些(QoS)
- hdu4091(暴力)
- linux同步硬件和系统时钟,liunx系统下时钟不同步会出现问题 怎么同步Linux 的系统时钟和硬件时钟?...
- 切图崽的自我修养-规范CSS元素命名
- Web3.0 兴起之际,元宇宙这杯羹怎么分?
- 华为智慧屏鸿蒙挂安卓9,荣耀先行!华为智慧屏9月发布:搭鸿蒙系统和自研芯片...
- 萌新向Python数据分析及数据挖掘 第二章 pandas 第二节 Python Language Basics, IPython, and Jupyter Notebooks...
- Java学习笔记-1.简介
- NIPS论文遭受全面质疑:论证过程普遍不完整,又何谈对错?
- php处理管道文件流
- 3.MongoDB uri中包含特殊字符与读策略配置
- fileboy v1.9 发布,文件变更监听通知系统
- Netty 是什么,Netty原理详解
- 解决谷歌Chrome浏览器默认主页被毒霸篡改的问题
- 视觉显著性python_OpenCV中的显著性检测(Saliency Detection)
- Mars3D(含Cesium)数据及服务篇:发布三维数据服务