责任链模式
Avoid coupling the sender of a request to its receiver by giving more than one
object a chance to handle the request. Chain the receiving objects and pass the
request along the chain until an object handles it.
定义
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止,如图中所示。
责任链方式通常使用数组或者链表实现。
使用职责职责链模式常用在框架开发中,用来实现框架的过滤器、拦截器功能,让框架的使用者在不需要修改框架源码的情况下,添加新的过滤拦截功能。这也体现了对扩展开放、对修改关闭的设计原则 。
代码示例1
使用链表实现,每个handler调用下个handler的handle函数,其中doHandle函数中实现本handler的逻辑处理。为了避免handle函数执行时,handler忘记调用下个handler的handle方法,本方法的调用,由基类实现。
public abstract class Handler {
protected Handler successor = null;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public void handle() {
boolean handled = doHandle();
//根据handled结果判断是否需要继续处理
if (!handled && successor != null) {
successor.handle();
}
}
public abstract boolean doHandle();
}
public class HandlerA extends Handler {
@Override
public boolean doHandle() {
System.out.println("HandlerA process");
return false;
}
}
public class HandlerB extends Handler {
@Override
public boolean doHandle() {
System.out.println("HandlerB");
return false;
}
}
public class HandlerChain {
private Handler head = null;
private Handler tail = null;
public void addHandler(Handler handler) {
handler.setSuccessor(null);
if (head == null) {
head = handler;
tail = handler;
return;
}
tail.setSuccessor(handler);
tail = handler;
}
public void handle() {
if (head != null) {
head.handle();
}
}
}
public class Application {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
chain.handle();
}
}
代码示例2
使用数组实现责任链的依次调用
public interface Ihandler {
boolean handle();
}
public class HandlerA implements Ihandler {
@Override
public boolean handle() {
System.out.println("Version Three: Handler A");
return false;
}
}
public class HandlerB implements Ihandler {
@Override
public boolean handle() {
System.out.println("Version Three: Handler B");
return false;
}
}
public class HandlerChain {
private ArrayList<Ihandler> handlers = new ArrayList<>();
public void addHandler(Ihandler handler) {
this.handlers.add(handler);
}
public void handle() {
for (Ihandler handler : handlers) {
boolean handled = handler.handle();
if (handled) {
break;
}
}
}
}
public class Application {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
chain.handle();
}
}
andlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
chain.handle();
}
}