简明 责任链模式(5.1)

学生请假是一个经典的引入责任链模式(Chain of Responsibility pattern)的现实场景。学生通常向辅导员请假,按照请假的天数不同如几节课、几天、一个月、一年等,辅导员可能自己或要请示院党委副书记、书记、学校校长批准。

责任链模式可以称为“推卸”式的代理,多个对象能够处理客户发出的请求,即它们都具有相应的方法如handle()。

责任链模式中,多个处理者对象可以构成一定的数据结构,简单地如单向链表。不论构成什么结构,对于处理者的抽象正如数据结构中常用的结点。结点是自引用的,它含有一个或多个本类型的成员变量。

例程 6 1 简单的责任链
package structure.chain;
public abstract class IHandler{
    private IHandler next;//successor
    public void setNext(IHandler next){
        this.next = next;
    }
    public void handle(int day){
        if (next != null){
            next.handle(day);
        }else{System.out.println("no handler");}
    }
}
package structure.chain;
public class H2 extends IHandler{
    @Override public void handle(int day){
        if (day<=6 && day>=1){//some Condition
            System.out.println("ok"+this.getClass().getName());
        }else{
            super.handle(day);
        }
    }
}

假定辅导员、院党委副书记、书记、学校校长分别为H1、H2、H3和H4。现在先实现H1和H2。测试类的代码:

例程 6-2 测试
package structure.chain;
import tool.God;
public class Student{
    public static void test(int x){
        IHandler h2 =(IHandler)God.create("6-1-1-H2");
        IHandler h1 =(IHandler)God.create("6-1-1-H1");
        h1.setNext(h2);
        h1.handle(x);
    }
}

BlueJ中测试输入1、2、10的输出为:

okstructure.chain.H1

okstructure.chain.H2

no handler

假设学生直接找H2处理,即最后一句为h2.handle(x),输入1为no handler。这是因为程序中处理者构成的是单向链表,可用双向链表解决此问题。也可以h2.setNext(h1)。

责任链模式将一个请求的处理者设计为一个链,链上的每个类都可以处理这个请求,或者将处理责任踢皮球给下家

责任链的“链”表示处理流程的走向,H1、H2、H3和H4本身的具体数据结构可以是单向链、单向环、双向链或树。一个典型的应用,就是处理者形成组合模式的树形结构,而将请求/责任沿着树形结构的某种路径,向上或向下传递。

本例有若干细节需要注意:

l        请求者可以向责任链上任一处理者提出请求。在相应的结构支持下,可以按照处理权限上交的方式、按照分段(权限平行)的方式或向下授权的方式处理。例程中演示了分段的方式,你可以改成上交的方式,规定学生总是找辅导员请假。

l        请求可以被责任链处理或不处理。如果要求“请求在责任链中必须被处理”,可以在抽象类中给出默认处理方案。

l        本例中子类没有指定自己的后续结点。抽象类的next设计private而非其他访问权限,子类除了自己的处理代码,其他就交给super.handle(day)。

上述注意事项主要针对某些朋友的一些含混认识。通过修改上面的例子,你可以实验一下责任链的若干变体。

时间: 2024-10-12 22:52:31

简明 责任链模式(5.1)的相关文章

浅谈设计模式:责任链模式(Chain Of Responsibility)

热爱生活.享受娱乐.专注技术,欢迎关注微信公众号QGer,我们一起见证成长! 什么是责任链模式? 官方解释: avoid coupling the sender of a request to its receiver by giving multiple objects a chance to handle the request. 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系. 通俗解释:一个执行命令可能被多个对象处理,为避免发送命令者和接收(处理)命令者之间具有比

设计模式之责任链模式--- Pattern chain-of-responsibility

模式的定义 责任链模式定义如下: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it. 使多个对象都有机会处理请求,从而避免请求的发送

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

JAVA设计模式(13):行为型-责任链模式(Responsibility)

定义 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求, 如果能则处理,如果不能则传递给链上的一个对象. 场景: 打牌时,轮流出牌 接力赛跑 大学中,奖学金审批 公司中,公文审批 开发中常见的场景: Java中,异常机制就是一种责任链模式.一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch. Javascript语言中,事件的冒泡和捕获机制.Java语言中,事件的处理采用观察者模式. Servlet开发中

设计模式_责任链模式

定义 Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求.从而避免了请求的发送者和接受者之间的耦合关系.

5 行为型模式之- 责任链模式

责任链模式介绍: 责任链模式是行为模式之一,什么是"链"?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性.将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式. 责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这

责任链模式

案例分析 责任链模式可以通过形象的生活例子进行解读,不管是前端攻城狮还是后端攻城狮,责任链的思想都有所体现(框架之中) 击鼓传花 老太和一群姑娘准备玩击鼓传花的游戏,于是找来了一个击鼓的人,游戏规则就是:随着鼓点声音,从她们之间传递一束花,鼓声落,传花停.花最后传递到那个姑娘的手中,那么就由她来给大家即兴赋诗一首. 那么击鼓的人并不需要知道玩游戏的这些人是谁,只需要击鼓即可,相当于客户端发送一个请求,请求在这些姑娘之间传递,总会有一个姑娘最后接到花,给大家赋诗.(一层层的传递请求,总会有一层来对

[设计模式] javascript 之 责任链模式

责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式定义了一些可能的处理请求的节点对象,请求的起点跟顺序都可能不一样,处理的节点根据请求的不一样而不同:请求者不必知道数据处理完成是由谁来操作的,内部是一个黑箱的操作过程,这是它的一个核心内容: 责任链模式:角色 抽象处理者角色:定义处理方法,以配置是否具有下个节点(Handler)对象; 具体处理者角

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

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