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 相关文章推荐
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
Python 实现链表实例代码
Apr 07 Python
python递归函数绘制分形树的方法
Jun 22 Python
python读取各种文件数据方法解析
Dec 29 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
Python中bisect的使用方法
Dec 31 Python
MATLAB数学建模之画图汇总
Jul 16 Python
python如何对链表操作
Oct 10 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 Python
python3判断IP地址的方法
Mar 04 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 21 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 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中使用X-SendFile头让文件下载更快
2014/06/01 PHP
php限制ip地址范围的方法
2015/03/31 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
戴尔美国官网:Dell
2016/08/31 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
解释一下钝化(Swap out)
2016/12/26 面试题
减负增效提质方案
2014/05/23 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript