JS设计模式之责任链模式实例详解


Posted in Python onFebruary 03, 2018

本文实例讲述了JS设计模式之责任链模式。分享给大家供大家参考,具体如下:

责任链设计模式:

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式涉及到的角色如下所示:

● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

● 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

JS设计模式之责任链模式实例详解

在JS(ES6之前)中严格意义上是没有extends继承概念,所以以下代码没有模拟抽象类,代码中只实现了具体处理类.

使用场景:在一个购物商城,在五一做了一个活动,所以图书类商品根据购买的金额依次做出以下折扣方案,

1、购买满199元,打9折
2、购买满399元,打8折
3、购买满599元以上,打7折;

责任链链的优点:

请求发送者只需要知道链中的第一个节点,从而弱化了发送者和一组接收者之间的强联系。如果不使用责任链链模式、根据当前价格客户端要知道每一级打折信息,最后知道具体是那一层上打折才是符合当前价格的折扣。

function BookHandler() {
 this.calcPrice = function( price ) {
  if ( 199 > price ) {
   console.log("原价是:"+ price);
  } else {
   this.successor.calcPrice( price );
  }
 }
 this.setSuccessor = function( _successor ) {
  this.successor = _successor;
 }
}
function BookCalc9Handler( _successor ) {
 this.calcPrice = function( price ) {
  if ( 199 <= price && price < 399 ) {
   console.log("原价是:"+ price +";打9折后:" + (price * 0.9));
  } else {
   this.successor.calcPrice( price );
  }
 }
 this.setSuccessor = function( _successor ) {
  this.successor = _successor;
 }
}
function BookCalc8Handler() {
 this.calcPrice = function( price ) {
  if ( 399 <= price && price < 599 ) {
   console.log("原价是:"+ price +";打8折后:" + (price * 0.8));
  } else {
   this.successor.calcPrice( price )
  }
 }
 this.setSuccessor = function( _successor ) {
  this.successor = _successor;
 }
}
function BookCalc7Handler() {
 this.calcPrice = function( price ) {
  if ( price >= 599 ) {
   console.log("原价是:"+ price +";打7折后:" + (price * 0.7));
  } else {
   this.successor.calcPrice( price )
  }
 }
 this.setSuccessor = function( _successor ) {
  this.successor = _successor;
 }
}

客户端 :

var price = 400;
var bookHandler = new BookHandler();
var bookCalc9Handler = new BookCalc9Handler();
var bookCalc8Handler = new BookCalc8Handler();
var bookCalc7Handler = new BookCalc7Handler();
bookHandler.setSuccessor(bookCalc9Handler);
bookCalc9Handler.setSuccessor(bookCalc8Handler);
bookCalc8Handler.setSuccessor(bookCalc7Handler);
bookHandler.calcPrice(price);

Console.log打印出来的效果:

JS设计模式之责任链模式实例详解

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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

Python 相关文章推荐
python异步任务队列示例
Apr 01 Python
python命令行参数解析OptionParser类用法实例
Oct 09 Python
python实现指定字符串补全空格的方法
Apr 30 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
解析Python中的生成器及其与迭代器的差异
Jun 20 Python
Python+OpenCV让电脑帮你玩微信跳一跳
Jan 04 Python
Python BS4库的安装与使用详解
Aug 08 Python
python中协程实现TCP连接的实例分析
Oct 14 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
numpy使用技巧之数组过滤实例代码
Feb 03 #Python
python验证码识别实例代码
Feb 03 #Python
Django中cookie的基本使用方法示例
Feb 03 #Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 #Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 #Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 #Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 #Python
You might like
资料注册后发信小技巧
2006/10/09 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
用PHP代码给图片加水印
2015/07/01 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
Python 变量类型详解
2018/10/10 Python
详解Python的循环结构知识点
2019/05/20 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python返回数组的索引实例
2019/11/28 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
一年级学生评语大全
2014/04/21 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
英文版辞职信
2015/02/28 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
python 对图片进行简单的处理
2021/06/23 Python