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字符转换
Sep 06 Python
Python序列之list和tuple常用方法以及注意事项
Jan 09 Python
Python中with及contextlib的用法详解
Jun 08 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
Python selenium抓取微博内容的示例代码
May 17 Python
基于python神经卷积网络的人脸识别
May 24 Python
Python实现的knn算法示例
Jun 14 Python
Python PyCharm如何进行断点调试
Jul 05 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
python中的对数log函数表示及用法
Dec 09 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 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/11/16 PHP
浅谈php自定义错误日志
2015/02/13 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
关于使用axios的一些心得技巧分享
2017/07/02 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
Python 的 with 语句详解
2014/06/13 Python
详细解读Python中的__init__()方法
2015/05/02 Python
python构建基础的爬虫教学
2018/12/23 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
美国旅游签证工作证明
2014/10/14 职场文书
房屋维修申请报告
2015/05/18 职场文书