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 09 Python
python处理html转义字符的方法详解
Jul 01 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
Python3网络爬虫中的requests高级用法详解
Jun 18 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
python 提取文件指定列的方法示例
Aug 07 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
python生成随机红包的实例写法
Sep 02 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
python引入其他文件夹下的py文件具体方法
May 23 Python
Python一些基本的图像操作和处理总结
Jun 23 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
php自定文件保存session的方法
2014/12/10 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
vuex实现简易计数器
2016/10/27 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
Python实例之wxpython中Frame使用方法
2014/06/09 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
实用求职信范文分享
2013/12/25 职场文书
会计专业自我鉴定范文
2013/12/29 职场文书
测控技术与仪器个人求职信范文
2013/12/30 职场文书
电力安全事故反思
2014/04/27 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
升学宴学生致辞
2015/07/27 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript