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运算符重载用法实例分析
Jun 01 Python
python3实现暴力穷举博客园密码
Jun 19 Python
浅析Python数据处理
May 02 Python
python爬虫获取百度首页内容教学
Dec 23 Python
pow在python中的含义及用法
Jul 11 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
Python获取时间戳代码实例
Sep 24 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
Oct 17 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
python2和python3哪个使用率高
Jun 23 Python
Pycharm 解决自动格式化冲突的设置操作
Jan 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
php ajax 静态分页过程形式
2011/09/02 PHP
深入php中var_dump方法的使用详解
2013/06/24 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
查看django版本的方法分享
2018/05/14 Python
详解flask入门模板引擎
2018/07/18 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
Python requests模块session代码实例
2020/04/14 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
Joules美国官网:出色的英国风格
2017/10/30 全球购物
商务英语专业毕业生自荐信
2013/11/05 职场文书
授权委托书怎么写
2014/04/03 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书
质量保证书格式模板
2015/02/27 职场文书
党员违纪检讨书
2015/05/05 职场文书
2016年元旦致辞
2015/08/01 职场文书
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android