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下线程之间的共享和释放示例
May 04 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
PyQt实现界面翻转切换效果
Apr 20 Python
django使用LDAP验证的方法示例
Dec 10 Python
基于python生成器封装的协程类
Mar 20 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
Python 3.8 新功能全解
Jul 25 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
python两种获取剪贴板内容的方法
Nov 06 Python
python动态规划算法实例详解
Nov 22 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 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中函数的形参与实参的问题说明
2010/09/01 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
Django验证码的生成与使用示例
2017/05/20 Python
python购物车程序简单代码
2018/04/18 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
Python Django view 两种return的实现方式
2020/03/16 Python
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
应届大专生自荐书
2014/06/16 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
幸福中国演讲稿
2014/09/12 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
mysql 子查询的使用
2022/04/28 MySQL