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操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
python中类的一些方法分析
Sep 25 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
python高级特性和高阶函数及使用详解
Oct 17 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
Python数据持久化存储实现方法分析
Dec 21 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
通过实例了解Python异常处理机制底层实现
Jul 23 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 Python
python如何将mat文件转为png
Jul 15 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
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
python代码实现ID3决策树算法
2017/12/20 Python
一道python走迷宫算法题
2018/01/22 Python
详解Python if-elif-else知识点
2018/06/11 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
pytorch实现查看当前学习率
2020/06/24 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
环保倡议书400字
2014/05/15 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
《确定位置》教学反思
2016/02/18 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
win10搭建配置ftp服务器的方法
2022/08/05 Servers