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将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
不可错过的十本Python好书
Jul 06 Python
python中 logging的使用详解
Oct 25 Python
python中的随机函数小结
Jan 27 Python
python调用API实现智能回复机器人
Apr 10 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
django多种支付、并发订单处理实例代码
Dec 13 Python
python global和nonlocal用法解析
Feb 03 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
Python数据可视化之绘制柱状图和条形图
May 25 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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
Python3生成手写体数字方法
2018/01/30 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
Python语法分析之字符串格式化
2019/06/13 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
python写日志文件操作类与应用示例
2019/07/01 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
前台文员的岗位职责
2013/11/14 职场文书
公关关系专员的自我评价分享
2013/11/20 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
大学生英文求职信范文
2015/03/19 职场文书
python 破解加密zip文件的密码
2021/04/22 Python