JavaScript实现职责链模式

什么是职责链模式

  职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。举个例子:当你从公交车后门上车之后,你不可能直接把硬币放到收款箱里面, 因为你不知道它在哪,那你就只能把硬币给你前面一个人,让他帮你传到前面一个人手上,这样一直传递到站在收款箱旁边人的手上,由他把硬币放到收款箱里面。

 

职责链模式思想

  请求发送者只需要知道链中的第一个节点,从而弱化了发送者和一组接收者之间的强联系。

 

JavaScript实现职责链模式(AOP方式)

  

  Function.prototype.after = function(fn) {var _self = this;return function () {var ret = _self.apply(this, arguments);if(ret === "nextSuccessor") {return fn.apply(this, arguments);}return ret;}}

  是的没错,在JavaScript中实现职责链模式就是如此的简单,如果对上面AOP代码不了解可以参考我之前写的这篇文章JavaScript实现AOP,这个方式和装饰者模式看起来很像,从代码上来看确实很像,但是他们的出发点是完全不同的

  AOP实现装饰者模式:在不改变已有函数内部的情况下添加一些新的功能,你可以想象一下同心圆,你每调用一次after,就相当于给你的圆外面又加了一个圆来包裹住它。注意它们是包含关系

  AOP实现职责链模式:在函数执行之后确定是否执行下一个函数,你每次调用after,都相当于在已有函数之后添加一个函数,至于是否执行后面这个函数,取决于前一个函数的返回值。注意它们是链式关系

 

职责链模式实例

  

function cat (type) {if(type == "cat") {console.log("我是猫猫");} else {return "nextSuccessor"}
}function dog (type) {if(type == "dog") {console.log("我是狗狗");} else {return "nextSuccessor"}
}function pig (type) {if(type == "pig") {console.log("我是猪猪");} else {return "nextSuccessor"}
}Function.prototype.after = function(fn) {var _self = this;return function () {var ret = _self.apply(this, arguments);if(ret === "nextSuccessor") {return fn.apply(this, arguments);}return ret;}
}var pet = cat.after(dog).after(pig);pet("pig");  //我是猪猪
pet("dog");  //我是狗狗
pet("cat");  //我是猫猫

  请看上述代码,我们给pet方法传入了三个不同的参数,得到了不同的结果。拿第一次调用举例,其执行过程是这样的:传入“pig”,先由cat方法判断,cat方法发现自己处理不了,于是把“pig”传递给dog方法(return "nextSuccessor"来表示传递给下一个函数),dog方法发现自己也处理不了,再接着把“pig”传递到pig方法,pig方法可以处理,控制台打印,我是猪猪。

你可能会觉得这不是浪费精神么,上述功能只需使用下面的几行代码就能解决,为何还要多写上面那么多代码

function pet(type) {if(type == "cat") {console.log("我是猫猫");} else if(type == "dog") {console.log("我是狗狗");} else if(type == "pig") {console.log("我是猪猪");}
}pet("pig");  //我是猪猪
pet("dog");  //我是狗狗
pet("cat");  //我是猫猫

  这样看来,好像是简单了很多。但是你有没有考虑过,如果以后突然多了猴子这种动物,如果使用上面的垃圾代码,那你就要去修改pet函数的源码,多添加一条if语句判断是不是猴子,其实这也还好,如果是加了1万种动物呢?那你就要在pet这个函数里添加1万条if语句,什么?还不够浮夸?那你有没有考虑过一种动物还会分很多品种,比如说猫咪分为长毛猫,短毛猫。这样你的代码就会涉及到嵌套if语句。恕我直言,现在你的代码已经丑成狗了,嘻嘻

  但是如果使用职责链模式,每多一个种动物,我们就给他定义一个函数,然后添加到职责链上,这样一来,新的函数就和原来的函数高度解耦。并且我们的请求发送者只需要传递给链的第一个节点,而不用关心传递给具体哪一个节点,反正它会顺着职责链传送下去,直到找到能处理请求的那个节点,并且处理请求。岂不美哉?

 

 

 

    

转载于:https://www.cnblogs.com/yonglin/p/8339239.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metrics介绍和Spring的集成

参考: http://colobu.com/2014/08/08/Metrics-and-Spring-Integration/ https://www.cnblogs.com/yangecnu/p/Using-Metrics-to-Profiling-WebService-Performance.html

配置 aws cli_AWS CLI教程–如何安装,配置和使用AWS CLI了解您的资源环境

配置 aws cliHow to get exactly the account and environment information you need to manage your AWS account using just the AWS CLI如何仅使用AWS CLI准确获取管理AWS账户所需的账户和环境信息 Installing the AWS CLI is actually quite simple. The best way to get …

grep递归查找头文件_Grep命令教程–如何使用递归查找在Linux和Unix中搜索文件

grep递归查找头文件grep stands for Globally Search For Regular Expression and Print out. It is a command line tool used in UNIX and Linux systems to search a specified pattern in a file or group of files. grep代表全局搜索正则表达式并打印出来 。 它是UNIX和Li…

C++ 前置声明

(一)class的前置声明 class的前置声明有两种。 pre.hclass PreA {}; main.hclass PreA; class Main {};//或者 class Main {class PreA* A; }; (二) struct前置声明 struct的前置声明只能用第一种。 (三) 有typedef的前置声明 Pr…

2.18 特殊权限set_uid 2.19 特殊权限set_gid 2.20 特殊权限stick_bit 2.21 软链接文件 2.22 硬连接文件...

2019独角兽企业重金招聘Python工程师标准>>> 特殊权限set_uid set_uid:该权限针对二进制可执行文件,使文件在执行阶段具有文件所有者的权限; 通俗一点讲就是,普通用户想要访问一个没有其他用户可执行权限的目录时,暂时…

345. 反转字符串中的元音字母

345. 反转字符串中的元音字母 给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。 元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现。 示例 1: 输入:s “hello” 输…

通过制作数字桌面游戏和Web应用程序学习JavaScript

Building 2D games can be a great way to learn JavaScript, especially when working through the basics of complex tabletop game logic.制作2D游戏可能是学习JavaScript的好方法,尤其是在研究复杂的桌面游戏逻辑基础时。 In this series, I’m going to intr…

【HAVENT原创】Node Express API 通用配置

为什么80%的码农都做不了架构师?>>> ( 基于 Express 4.x ) 启动文件 /app.js: var express require(express); var bodyParser require(body-parser); var proxy require(http-proxy-middleware); var path require(path);var index re…

C#使用Json.NET解析Json

本文转载自 http://xiaosheng.me/2016/10/01/article25/ 最近在 C# 项目中需要使用到 Json 格式的数据,我简单上网搜索了一下,基本上有两种操作 Json 数据的方法: 使用 Windows 系统自带的类使用第三方的包本着“第三方包一定有比系统自带类优…

现在JavaScript日期–如何在JavaScript中获取当前日期

Many applications you build will have some sort of a date component, whether its the creation date of a resource, or the timestamp of an activity. 您构建的许多应用程序都将具有某种日期组件,无论是资源的创建日期还是活动的时间戳。 Dealing with date…

233. 数字 1 的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1: 输入:n 13 输出:6 示例 2: 输入:n 0 输出:0 解题思路 正确性证明 例如:对于n3015&#xff0c…

Linux串口设置参数

为什么80%的码农都做不了架构师?>>> 在Linux环境下,串口名从ttyS0开始依次是ttyS1、ttyS2等。在本程序中,使用ttyS0作为通信串口。在打开ttyS0的时候选项 O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信…

STM32F013 十元板

我大拇指般大小。STM32F103C8T6,64K Flash,20K RAM,m3的核。十元,应该是价格极限了吧。 通过USB供电(5V),也可以排针3.3V供电。可惜没有引出5V排针。USB口可以供电和USB通讯,没有USB…

如何在Python中建立和训练K最近邻和K-Means集群ML模型

One of machine learnings most popular applications is in solving classification problems.机器学习最流行的应用之一是解决分类问题。 Classification problems are situations where you have a data set, and you want to classify observations from that data set in…

552. 学生出勤记录 II

552. 学生出勤记录 II 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符: ‘A’:Absent,缺勤 ‘L’:Late,迟…

C/C++中计算函数运行时间

#include<stdio.h> #include<time.h> clock_t start,stop;//clock_t 是clock&#xff08;&#xff09;函数返回变量的类型 double duration;//记录被测函数的运行时间&#xff0c;以秒为单位 int main() { startclock();//开始计时 MyFunction();//把被测函数加在这…

作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars

为什么需要使用模板引擎&#xff1f; 关于为什么要使用模板引擎&#xff0c;按照我常说的一句话就是&#xff1a;不用重复造轮子了。 简单来说&#xff0c;模板最本质的作用是“变静为动”&#xff0c;一切利于这方面的都是优势&#xff0c;不利于的都是劣势。要想很好地实现“…

extjs 实用开发指南_如何提出有效问题:针对开发人员的实用指南

extjs 实用开发指南Learning is a journey that never ends. At every point in your career, you will keep learning, re-learning, and un-learning. 学习是一个永无止境的旅程。 在职业生涯的每个阶段&#xff0c;您都会不断学习&#xff0c;重新学习和不学习。 The abil…

LOJ 6270

最近&#xff08;一直&#xff09;有点&#xff08;很&#xff09;蠢 按照区间大小排序做区间包含多少区间的话 只用考虑 左端点比当前左端点小的和右端点比当前右端点大的&#xff0c;因为不可能同时满足 关于K&#xff0c;就在做到K的时候减一下就好了&#xff0c;一直傻逼在…

Zabbix3.4安装详细步骤

Zabbix3.4安装的详细步骤一、zabbix介绍现在大多数公司都会用到监控软件&#xff0c;主流的监控软件就是Zabbix了&#xff0c;当然还会有Nagios等其他的软件&#xff1a;zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种…