Welcome everyone

责任链模式

设计模式 汪明鑫 667浏览 0评论

概念

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
这种类型的设计模式属于行为型模式。

 

责任链模式屏蔽了请求的处理过程,你发起一个请求到底是谁处理的,这个你不用关心,只要你把请
求抛给责任链的第一个处理者,最终会返回一个处理结果(当然也可以不做任何处理),作为请求者可以不
用知道到底是需要谁来处理的,这是责任链模式的核心。

 

责任链模式 VS 观察者模式

观察者模式也可以实现请求的传递,比如一个事件发生了,通知了观察者,
同时观察者又作为一个被观察者,通知了另外一个观察者,这也形成了一个事件广播链,
这和责任链是有区别的:
1,受众数量不同。观察者广播链式可以 1:N 的方式广播,而责任链则要求是的 1:1 的传递,必然有一个
且只有一个类完成请求的处理;
2,请求内容不同。观察者广播链中的信息可以在传播中改变,但是责任链中的请求是不可改变的;
3,处理逻辑不通。观察者广播链主要用于触发联动动作,而责任链则是对一个类型的请求按照既定的规
则进行处理。

 

举个例子,以学生请假的过程模拟责任链模式

类图

 

代码

/**
 * 用学生请假来模拟责任链模式
 *    假设:
 *    学生只请几天假,给班主任说就行
 *    学生请1周及以上,需要给班主任说,班主任没权力决定,需要上报年级辅导员
 *    学生请1个学期假,需要给班主任说,班主任没权力决定,需要上报年级辅导员,年级辅导员辅导员也没有权力,上报院长
 *
 *    学生发起一个请假的请求
 *    班主任处理  ---班主任权利不够---> 年级辅导员处理  ------年级辅导员权力不够------>  院长处理
 *
 *    形成了一个链
 *
 *    这就是责任链模式
 *
 *
 * @author: wangmingxin1
 * @create: 2018-11-27 12:50
 **/
public class Student {

    private int type = 0;   //表示请假的类型: 1表示只请假几天,2表示请假一周及以上,3表示

    private String name = "";

    private String request = "";

    public Student(int type,String name, String request) {
        this.type = type;
        this.request =name + request;
    }

    public int getType() {
        return type;
    }

    public String getName() {
        return name;
    }

    public String getRequest() {
        return request;
    }
}

 

/**
 * @author: wangmingxin1
 * @create: 2018-11-27 14:15
 **/
public abstract class Handler {
    private int level =0;  //权力等级

    private Handler nextHanlder;  //责任链的下一位

    public Handler(int level) {
        this.level = level;
    }

    //处理学生的请求信息
    public final void HandleMessage(Student student){
        if(this.level == student.getType()){
            response(student);
        }else{
            System.out.println("我决定不了,上报给我的上一级决定...");
            if(this.nextHanlder !=null){
                this.nextHanlder.HandleMessage(student);
            }
        }
    }

    protected abstract void response(Student student);

    public void setNextHanlder(Handler nextHanlder) {
        this.nextHanlder = nextHanlder;
    }

    
}
/**
 * 班主任
 *
 * @author: wangmingxin1
 * @create: 2018-11-27 14:21
 **/
public class ClassTeacher extends Handler{

    public ClassTeacher() {
        super(1);  //班主任的权力级别为1
    }

    @Override
    protected void response(Student student) {
        System.out.println(student.getRequest());
        System.out.println("班主任同意了"+student.getName() + "请假 ...");
    }


}
/**
 * 年级辅导员
 *
 * @author: wangmingxin1
 * @create: 2018-11-27 14:32
 **/
public class GradeInstructor extends Handler{
    public GradeInstructor() {
        super(2);  //年级辅导员的权力级别为2
    }

    @Override
    protected void response(Student student) {
        System.out.println(student.getRequest());
        System.out.println("年级辅导员同意了"+student.getName() + "请假 ...");
    }

}
/**
 * 院长
 *
 *
 * @author: wangmingxin1
 * @create: 2018-11-27 14:35
 **/
public class President extends Handler {

    public President() {
        super(3);  //院长的权力级别为3
    }

    @Override
    protected void response(Student student) {
        System.out.println(student.getRequest());
        System.out.println("院长同意了"+student.getName() + "请假 ...");
    }
}

 

/**
 * @author: wangmingxin1
 * @create: 2018-11-27 14:36
 **/
public class Main {
    public static void main(String[] args){
        Student zhangsan = new Student(3,"张三","请一个学期假,在家打英雄联盟");

        //创建3个Handler 
        ClassTeacher classTeacher = new ClassTeacher();
        GradeInstructor gradeInstructor = new GradeInstructor();
        President president = new President();

        //形成一个链
        classTeacher.setNextHanlder(gradeInstructor);
        gradeInstructor.setNextHanlder(president);
        //这里可以根据实际需求一直setNext

        //只用把请求发给班主任,具体怎样的流程不用关心
        classTeacher.HandleMessage(zhangsan);

    }
}

 

运行

 

流程

 

转载请注明:汪明鑫的个人博客 » 责任链模式

喜欢 (3)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz