[设计模式] 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);
}

其他说明

责任链模式,总的一个核心就是请求者不必知道是谁哪个节点对象处理的请求,由于处理请求的可以不同对象下处理,所以请求者跟接受者是解耦的。

纯的责任链:要求请求在这些对象链中必须被处理,而且一个节点处理对象,要么只处理请求,要么把请求转发给下个节点对象处理;

不纯的责任链:要求在责任链里不一定会有处理结构,而且一个节点对象,即可以处理部分请求,并把请求再转发下个节点处理;

时间: 2024-11-05 12:35:19

[设计模式] javascript 之 责任链模式的相关文章

[设计模式-行为型]责任链模式(Chain of Responsibility)

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

设计模式之GOF23责任链模式

责任链模式chain of responsibility 将能够处理同一类请求的对象连成一条链,所提交的请求依次在链上传递,直到传递至有能力处理该请求的对象,不能则传给链上下一个 场景: -打牌时 -奖学金审批 -请假审批 核心:是在客户端中才成链,也可以通过配置文件或者存在数组中加载 开发中常见场景: -try catch异常链 -javascript语言中,事件的冒泡和捕获机制 Java语言中,事件处理采用观察者模式 -Servlet开发中,过滤器的链式处理 -Struts2中,拦截器的调用

设计模式学习-责任链模式

1.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 2.类图 3.代码示例 1 package com.zhaoyangwoo.chainOfResponsibility; 2 3 /** 4 * Created by john on 16/6/16. 5 * 职责链模式,经费审批场景 6 */ 7 public class Responsibility { 8 9 public static void

Java设计模式系列之责任链模式

责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任.Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口. 为了方便理解,责任链模式直接用马士

《Java设计模式》之责任链模式

责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒.

设计模式--8、责任链模式

[转载]责任链模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位

Java设计模式(七) COR(责任链)模式及Tomcat引申

基本概念 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,知道有对象处理它为止. COR(责任链)模式的角色分工: Handler:抽象处理者,定义一个处理请求的接口 Concrete Handler: 具体处理者,处理请求的具体类,或者传给"下家". Requester:发出请求等待处理的类,它无需关注到底是哪个具体的Handler处理它的请求 COR的处理问题的场景: 一个request在多个handle

《Java设计模式 》之责任链模式

责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒.

【GOF23设计模式】责任链模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 1 package com.test.chainOfResp; 2 /** 3 * 封装请假的基本信息 4 */ 5 public class LeaveRequest { 6 private String empName; 7 private int leaveDays; 8 private String reason; 9 10 publi