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脚本文件打包成可执行文件的方法
Jun 02 Python
python的re正则表达式实例代码
Jan 24 Python
快速解决安装python没有scripts文件夹的问题
Apr 03 Python
Python selenium抓取微博内容的示例代码
May 17 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
python制作英语翻译小工具代码实例
Sep 09 Python
Python3 解决读取中文文件txt编码的问题
Dec 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
配置支持SSI
2006/11/25 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
php实现的双色球算法示例
2017/06/20 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
python装饰器的特性原理详解
2019/12/25 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
python和c语言哪个更适合初学者
2020/06/22 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
化学实验员岗位职责
2013/12/28 职场文书
护士的自我鉴定
2014/02/07 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
2014年科技工作总结
2014/11/26 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript