责任链模式:在责任链中,有很多对象连成一条链,像链表一样。然后请求在这条链上传递,直到链上某一个对象处理此请求。发出这个请求的人也不知道链条上哪一个对象最终处理这个请求,但是一直会有人处理,如果没人处理就会进行提示。
在日常生活中,一个事情多个对象处理是很常见的。比如说请假流程,可以请假的有部门负责人、副总经理、总经理等,但是每个领导能批准的天数也不同。如果员工需要请假要找不同的领导,那么对于员工来说无疑是增加了难度。但是如果层层递交,那么将会省事很多。
模式的实现
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
抽象处理者
public abstract class Handler { private Handler next; public void setNext(Handler next) { this.next = next; } public Handler getNext() { return next; } //处理请求的方法 public abstract void handleRequest(String request); }
具体处理者1
public class Handler1 extends Handler { @Override public void handleRequest(String request) { if (request.equals("1")) { System.out.println("1号进行处理"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } }
具体处理者2
public class Handler2 extends Handler { @Override public void handleRequest(String request) { if (request.equals("2")) { System.out.println("2号进行处理"); } else { if (getNext() != null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } }
客户端
public class Client { public static void main(String[] args) { //1.设置责任链 Handler1 handler1 = new Handler1(); Handler2 handler2 = new Handler2(); handler1.setNext(handler2); //2.处理请求 handler1.handleRequest("1"); handler1.handleRequest("2"); handler1.handleRequest("3"); } }
结果
1号进行处理 2号进行处理 没有人处理该请求!
优点
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者
删除责任。
4、增加新的请求处理类很方便。
缺点
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
适用场景
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。