责任链模式
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式角色介绍
- Handler:抽象处理者角色,声明一个请求处理方法,并在其中保持一个对下一个处理借点Handler对象的引用。
- ConcreteHandler:具体处理者角色,对请求进行处理,如果不能处理则将该请求转发下一个节点上的处理对象。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。比如学生请假三天以内可以直接找辅导员批准,三天以上就要辅导员找主任批准,这上下关系连起来就是一条链。
代码示例
抽象处理者角色
public abstract class Leader {
public Leader leader;
public abstract void leave(int day);//请假
}
各具体处理者角色
//学生
public class Student extends Leader {
public void leave(int day) {
//向上级请假
leader.leave(day);
}
}
//辅导员
public class Instructor extends Leader {
public void leave(int day) {
if (day < 3) {
// 辅导员只能批准三天内的假期
System.out.println("辅导员批假了");
} else {
//向上级请假
leader.leave(day);
}
}
}
//主任
public class Director extends Leader {
public void leave(int day) {
System.out.println("主任批假了");
}
}
客户端
Leader student = new Student();
Leader instructor = new Instructor();
Leader director = new Director();
student.leader = instructor;
instructor.leader = director;
student.leave(2);//辅导员批假了
student.leave(5);//主任批假了
责任链模式可以对请求者和处理者关系解耦,提高代码的灵活性。使用场景也会广泛,优先级事件、拦截事件、层级关系都可以用责任链模式使代码更灵活。不足之处望指教。