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和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
Java及python正则表达式详解
Dec 27 Python
pycham查看程序执行的时间方法
Nov 29 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
tensorflow之并行读入数据详解
Feb 05 Python
Python3实现打印任意宽度的菱形代码
Apr 12 Python
Python pip安装第三方库实现过程解析
Jul 09 Python
python的flask框架难学吗
Jul 31 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 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
基于curl数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
php字符串函数学习之substr()
2015/03/27 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
JavaScript 数组详解
2013/10/10 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
js实现消息滚动效果
2017/01/18 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
在python的类中动态添加属性与生成对象
2016/09/17 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
Python处理PDF与CDF实例
2020/02/26 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
Python实现异步IO的示例
2020/11/05 Python
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
团干部培训方案
2014/06/03 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
2014年除四害工作总结
2014/12/06 职场文书