目录
概念
责任链模式(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);
}
}
运行
流程
说点什么
您将是第一位评论人!