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抓取网页图片并放到指定文件夹
Apr 24 Python
Python中的包和模块实例
Nov 22 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
python在非root权限下的安装方法
Jan 23 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
python读取Excel表格文件的方法
Sep 02 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
Python迭代器协议及for循环工作机制详解
Jul 14 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静态调用非静态方法的应用分析
2013/05/02 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
python生成随机密码或随机字符串的方法
2015/07/03 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
StubHub德国:购买和出售门票
2017/09/06 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2015大学生实训报告
2014/11/05 职场文书
华清池导游词
2015/02/02 职场文书
学年个人总结范文
2015/03/05 职场文书
求职简历自我评价范文
2015/03/10 职场文书
考研导师推荐信范文
2015/03/27 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
nginx之queue的具体使用
2022/06/28 Servers