javascript设计模式 ? 策略模式原理与用法实例分析


Posted in Javascript onApril 21, 2020

本文实例讲述了javascript设计模式 ? 策略模式原理与用法。分享给大家供大家参考,具体如下:

介绍:策略模式中可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法。在这里,每一种算法的封装都可以称之为一种策略。策略模式的主要目的是将算法的定义与使用分开。

定义:定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立与使用它的客户而变化,也称为政策模式。策略模式是一种对象行为型模式。

场景:使用策略模式实现一个加减乘除的工具类,将四个算法进行封装。

示例:

var AddStrategy = function(){
  this.caculate = function(num1, num2){
    return num1 + num2;
  }
}
 
var SubStrategy = function(){
  this.caculate = function(num1, num2){
    return num1 - num2;
  }
}
 
var MulStrategy = function(){
  this.caculate = function(num1, num2){
    return num1 * num2;
  }
}
 
var DivStrategy = function(){
  this.caculate = function(num1, num2){
    return num1 / num2;
  }
}
 
var Context = function(strategy){
  var _strategy = strategy;
 
  this.executeStrategy = function(num1, num2){
    return _strategy.caculate(num1, num2)
  }
}
var add = new Context(new AddStrategy());
var sub = new Context(new SubStrategy());
var mul = new Context(new MulStrategy());
var div = new Context(new DivStrategy());
 
console.log('1 + 2 = ' + add.executeStrategy(1, 2));
console.log('5 - 1 = ' + sub.executeStrategy(5, 1));
console.log('3 * 2 = ' + mul.executeStrategy(3, 2));
console.log('8 / 2 = ' + div.executeStrategy(8, 2));
 
// 1 + 2 = 3
// 5 - 1 = 4
// 3 * 2 = 6
// 8 / 2 = 4

在这个例子里,Context称之为环境类,环境类是使用算法的角色,他在解决某个问题时可以采用多种策略。我们的例子里,根据传递的策略不同,导致Context作出不同的处理方式。
DivStrategy,MulStrategy,SubStrategy,AddStrategy称为策略类,用来实现具体策略。

策略模式总结:

优点:

* 提供了开关原则的完美支持,可以再不修改原有系统基础上进行扩展
* 策略模式提供了一种可以替换继承关系的办法
* 使用策略模式可以避免多重条件选择语句。

缺点:

* 客户端必须知道所有的策略类,并自行选择需要使用哪一个策略
* 策略模式将造成系统产生很多策略类,任何细小的变化都导致系统需要新增一个新的策略类
* 客户端每次只能选择使用一个策略类

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Javascript中 关于prototype属性实现继承的原理图
Apr 16 Javascript
使用闭包对setTimeout进行简单封装避免出错
Jul 10 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
AngularJS入门教程之服务(Service)
Jul 27 Javascript
jquery-mobile表单的创建方法详解
Nov 23 Javascript
JS出现失效的情况总结
Jan 20 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
Mar 09 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
Jan 04 Javascript
详解vuex的简单使用
Mar 12 Javascript
js回调函数仿360开机
Dec 26 Javascript
如何在postman中添加cookie信息步骤解析
Jun 30 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
Aug 21 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 #Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 #Javascript
Vue的全局过滤器和私有过滤器的实现
Apr 20 #Javascript
深入浅析JavaScript中的in关键字和for-in循环
Apr 20 #Javascript
vue实现购物车功能(商品分类)
Apr 20 #Javascript
vue实现淘宝购物车功能
Apr 20 #Javascript
javascript利用键盘控制小方块的移动
Apr 20 #Javascript
You might like
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
js 图片转base64的方式(两种)
2018/04/24 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Python3常用内置方法代码实例
2019/11/18 Python
python 实现list或string按指定分段
2019/12/25 Python
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
企业文化理念标语
2014/06/10 职场文书
怎样写离婚协议书
2014/09/10 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
护士工作心得体会
2016/01/25 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
JavaScript前端面试组合函数
2022/06/21 Javascript
go goth封装第三方认证库示例详解
2022/08/14 Golang