职责链模式简介及使用示例
职责链模式简介
功能:处理链式传递的请求 使用场景:
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。
类图:
使用示例
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 处理了请求
总结
优点:客户端无需知道具体由谁来处理请求,而且可以指定职责链的顺序。当需要添加新的任务处理者时无需修改原有代码,直接新增类即可。 缺点:当职责链较长时会产生大量的无用类对象。
