职责链模式简介及使用示例
职责链模式简介
功能:处理链式传递的请求 使用场景:
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。
类图:
使用示例
public abstract class Handler { private Handler successor; public Handler getSuccessor() { return successor; } public void setSuccessor(Handler successor) { this.successor = successor; } public abstract void handlerRequest(int request); }
public class ConcreteHandler1 extends Handler { @Override public void handlerRequest(int request) { if(request<10){ System.out.println("ConcreteHandler1 处理了请求"); }else{ this.getSuccessor().handlerRequest(request); } } }
public class ConcreteHandler2 extends Handler { @Override public void handlerRequest(int request) { if(10<= request && request <20){ System.out.println("ConcreteHandler2 处理了请求"); }else{ this.getSuccessor().handlerRequest(request); } } }
客户端
public class Client { public static void main(String[] args) { Handler concreteHandler1 = new ConcreteHandler1(); Handler concreteHandler2 = new ConcreteHandler2(); concreteHandler1.setSuccessor(concreteHandler2); concreteHandler2.setSuccessor(new DefaultHandler()); int[] request = new int[]{ 1,20,11}; for (int i : request){ concreteHandler1.handlerRequest(i); } System.out.println("==========="); for (int i : request){ concreteHandler2.handlerRequest(i); } } }
运行结果:
ConcreteHandler1 处理了请求 执行默认处理 ConcreteHandler2 处理了请求 =========== 执行默认处理 执行默认处理 ConcreteHandler2 处理了请求
总结
优点:客户端无需知道具体由谁来处理请求,而且可以指定职责链的顺序。当需要添加新的任务处理者时无需修改原有代码,直接新增类即可。 缺点:当职责链较长时会产生大量的无用类对象。