[设计模式] javascript 之 责任链模式
责任链模式:定义
责任链接模式又称职责链模式,是一种对象的行为模式;它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求;该模式定义了一些可能的处理请求的节点对象,请求的起点跟顺序都可能不一样,处理的节点根据请求的不一样而不同;请求者不必知道数据处理完成是由谁来操作的,内部是一个黑箱的操作过程,这是它的一个核心内容;
责任链模式:角色
抽象处理者角色:定义处理方法,以配置是否具有下个节点(Handler)对象;
具体处理者角色:定义处理方法的具体执行逻辑,判断是否可以处理该请求,如果可以就处理(返回结果结束);如果不行,就查看是有下个节点,有的话就传递给下家;
使用场景
比如公司采购申请,比如说部门或团队旅游申请等等,一切可能需要经过几个流程直到某个流程节点能够处理它为止的情况;
部门最近因为某个项目需要采购一批设备,价值可能在几十万左右,部门经理让其下的同事A,上OA写了个采购申请;这个申请首先进入采购部负责人这里,由于金额很大,他没办法直接处理(当然他还可以写下意见),就转交上级公司总经理处理,总经理有权处理这么大金额的采购,就写个同意就通过了;
如果总经理也没有处理这种金额的权限,也就只能再转交更上层董事长来处理决定;
当然,这其中可能遇到特殊情况,比如说采购部负责人不在,项目又非常着急;又或者这个大项目是总经理直接监督负责的,但是又需按流程有记录,就可以发个OA,直接将这个采购跳过采购部,直接到总经理这边。
模型结构

事例源码
1. 抽象处理者角色:
function Handler() {
this.next = null;
this.setNext = function(_handler) {
this.next = _handler;
};
this.handleRequest = function(money) {
}
};
//采购部
function CGBHandler = function() {}
CGBHandler.prototype = new Handler();
CGBHandler.prototype.handleRequest = function(money) {
//处理权限最多10000
if (money < 10000){
console.log('同意');
} else {
console.log('金额太大,只能处理一万以内的采购');
if (this.next) {
this.next.handleRequest(money);
}
}
};
//总经理
function ZJLHandler = function() {}
ZJLHandler .prototype = new Handler();
ZJLHandler .prototype.handleRequest = function(money) {
//处理权限最多100000
if (money < 100000){
console.log('10万以内的同意');
} else {
console.log('金额太大,只能处理十万以内的采购');
if (this.next) {
this.next.handleRequest(money);
}
}
};
//董事长
function DSZHandler = function() {}
DSZHandler .prototype = new Handler();
DSZHandler .prototype.handleRequest = function(money) {
//处理权限至少100000
if (money >= 100000){
console.log('10万以上的我来处理');
//处理其他逻辑
}
};
客户端使用
function Client() {
var cgb = new CGBHandler();
var zjl = new ZJLHandler();
var dsz = new DSZHandler();
cgb.setNext(zjl);
zjl.setNext(dsz);
cgb.handleRequest(800000);
}
其他说明
责任链模式,总的一个核心就是请求者不必知道是谁哪个节点对象处理的请求,由于处理请求的可以不同对象下处理,所以请求者跟接受者是解耦的。
纯的责任链:要求请求在这些对象链中必须被处理,而且一个节点处理对象,要么只处理请求,要么把请求转发给下个节点对象处理;
不纯的责任链:要求在责任链里不一定会有处理结构,而且一个节点对象,即可以处理部分请求,并把请求再转发下个节点处理;
[设计模式] javascript 之 责任链模式的更多相关文章
- Python使用设计模式中的责任链模式与迭代器模式的示例
Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...
- Java设计模式学习记录-责任链模式
前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...
- 《java设计模式》之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 设计模式之GOF23责任链模式
责任链模式chain of responsibility 将能够处理同一类请求的对象连成一条链,所提交的请求依次在链上传递,直到传递至有能力处理该请求的对象,不能则传给链上下一个 场景: -打牌时 - ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- Java设计模式系列之责任链模式
责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...
- 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)
参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...
- Java描述设计模式(15):责任链模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...
- Java设计模式13:责任链模式
前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...
随机推荐
- ubuntu使用备忘
今天在一个古董机子上(03年的)安装了lubuntu14.04,内存512M,奔腾处理器,好像是什么迅驰不支持linux需要的某项技术pae,安装时提示cpu不支持pae,但可以在内核参数中添加for ...
- PHP中的一个”坑“
说一个极有可能在工作中遇到的问题——foreach的引用 foreach $arr = range(1,3); //[1,2,3] foreach($arr as &$val) { } for ...
- HDU 5802 Windows 10
传送门 Windows 10 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- centos7安装mplayer的方法
首先是要获取源代码. 首先是主程序的源代码. 打开你的终端,按照我的命令一步一步来: cd Download svn checkout svn://svn.mplayerhq.hu/mplayer/t ...
- Python3 学习笔记------迭代器
python 迭代器 要理解python迭代器(iterator),先要理解两个概念:Iterable(可迭代对象).Iterator(迭代器) 先来help()一下Iterator: >> ...
- Visual Studio 2013小技巧
Ctrl + F10 可以直接运行到光标处,而不用F10 逐过程 F11 逐语句了 当有多个断点时,按F5可以切换到下一个断点.
- IOS 中的CoreImage框架(framework)
http://www.cnblogs.com/try2do-neo/p/3601546.html coreimage framework 组成 apple 已经帮我们把image的处理分类好,来看看它 ...
- lunix的查看Tomcat目录下日志的快速操作
可以使用cd命令,cd命令的功能是切换到指定的目录: 命令格式:cd [目录名] 有几个符号作为目录名有特殊的含义: "/"代表根目录. ".."代表上一级目录 ...
- Win7系统开放C盘下文件夹Everyone权限
安装软件时遇到这样的情况:我就是管理员权限啊,怎么会安装有问题呢? 后来知道,用户名即使分配了你是管理员权限,有些文件还是有限制的(特别是C盘) 昨天遇到一个问题,有个文件夹里的隐藏文件就是无法显示, ...
- loading 加载
<script type="text/javascript" src="jquery-1.3.2.js"></script> <s ...