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 相关文章推荐
go和python调用其它程序并得到程序输出
Feb 10 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
python抓取京东小米8手机配置信息
Nov 13 Python
python实现学员管理系统
Feb 26 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
python中time库的实例使用方法
Oct 31 Python
python 爬取疫情数据的源码
Feb 09 Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 Python
Python matplotlib修改默认字体的操作
Mar 05 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
Python装饰器如何实现修复过程解析
Sep 05 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/03/23 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php防止站外远程提交表单的方法
2014/10/20 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP可变变量学习小结
2015/11/29 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
js页面跳转的常用方法整理
2013/10/18 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
vue router demo详解
2017/10/13 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
Python之reload流程实例代码解析
2018/01/29 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
学雷锋演讲稿汇总
2014/05/10 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
十佳党员事迹材料
2014/08/28 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书