责任链模式(Chain of Responsibility)是行为模式之一,该模式构造一系列分别担当不同职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作责任链模式。
一、应用场景:
例1:比如客户要完成一个任务,这个任务包括a,b,c,d四个部分。 首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分,…,直到D完成d部分。
例2:web开发中的filter和interceptor
二、UML类图

UML类图
抽象处理者(Handler)角色:定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。
具体处理者(ConcreteHandler)角色:如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。
三、java实现
public abstract class Handler {
protected Handler successor;
public abstract void handlerRequest(String condition);
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
public class ConcreteHandler1 extends Handler {
@Override
public void handlerRequest(String condition) {
System.out.println("ConcreteHandler1 handled ");
if (successor !=null) {
successor.handlerRequest(condition);
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handlerRequest(String condition) {
System.out.println("ConcreteHandler2 handled ");
if (successor !=null) {
successor.handlerRequest(condition);
}
}
}
public class ConcreteHandler3 extends Handler {
@Override
public void handlerRequest(String condition) {
System.out.println("ConcreteHandler3 handled ");
if (successor !=null) {
successor.handlerRequest(condition);
}
}
}
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
//链起来
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
handler1.handlerRequest("ConcreteHandler1");
}
}
四、模式优缺点
优点:
1、降低耦合度。职责链模式将请求处理细节(请求由哪些对象处理,怎样处理)跟客户端代码隔离开来,这些细节对客户端是透明的,客户端只需将相应的职责添加到链中即可,具体的处理过程交给责任链,降低了系统的耦合度。
2、增强了给对象指派职责的灵活性。可以通过在运行时对职责链进行动态的增加或修改来改变处理一个请求的职责,职责链的维护是客户端负责的,所以增加或修改责任链不影响类库代码,非常灵活。
缺点:
1、不保证请求被接受。由于责任链中的每个对象只处理自己感兴趣的请求,对于请求是否处理过并没有感知,这样容易导致请求没有对应的处理者。当一个请求的责任链没有正确配置时也会导致该请求得不到处理。
2、由于责任链模式请求处理的不确定性,所以加大了程序调试的难度。 |