责任链模式(ChainOfResponsibility)定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
责任链模式的优点有:
1、低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
2、增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
3、增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
4、责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
5、责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。
任务链:
1 public abstract class Handler { 2 private Handler next; 3 4 public Handler getNext() { 5 return next; 6 } 7 8 public void setNext(Handler next) { 9 this.next = next; 10 } 11 12 public abstract void handleRequest(String request); 13 } 14 15 public class ConcreteHandlerA extends Handler { 16 @Override 17 public void handleRequest(String request) { 18 // TODO Auto-generated method stub 19 System.out.println("A接受任务"); 20 if (request == "A") { 21 System.out.println("任务已经由<" + this.getClass().getName() + ">处理"); 22 } else { 23 System.out.println("任务A->B"); 24 Handler nexthandler = getNext(); 25 nexthandler.handleRequest(request); 26 } 27 } 28 } 29 30 public class ConcreteHandlerB extends Handler { 31 @Override 32 public void handleRequest(String request) { 33 // TODO Auto-generated method stub 34 System.out.println("B接受任务"); 35 if (request == "B") { 36 System.out.println("任务已经由<" + this.getClass().getName() + ">处理"); 37 } else { 38 System.out.println("任务B->C"); 39 Handler nexthandler = getNext(); 40 nexthandler.handleRequest(request); 41 } 42 } 43 } 44 45 public class ConcreteHandlerC extends Handler { 46 @Override 47 public void handleRequest(String request) { 48 // TODO Auto-generated method stub 49 System.out.println("C接受任务"); 50 if (request == "C") { 51 System.out.println("任务已经由<" + this.getClass().getName() + ">处理"); 52 } else { 53 System.out.println("任务处理失败,无后续任务接管"); 54 //setNext(new ConcreteHandlerC()); 55 } 56 } 57 }
调用方式:
1 //责任链 2 public class Client { 3 public static void main(String[] args) { 4 //定义责任 5 Handler handlerA = new ConcreteHandlerA(); 6 Handler handlerB = new ConcreteHandlerB(); 7 Handler handlerC = new ConcreteHandlerC(); 8 9 //设置责任链顺序 10 handlerA.setNext(handlerB); 11 handlerB.setNext(handlerC); 12 13 //提交任务请求 14 handlerA.handleRequest("D"); 15 } 16 }
执行结果:
责任链是单链表数据结构的体现。