设计模式之责任链模式
定义
责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。—— [ 百度百科 ]
解释说明
在责任链模式中,抽象责任链定义了链式处理结构,具体的处理逻辑则由子类去实现。举个例子:开发中,我们肯定会写到逻辑判断处理语句,如果需要进行逻辑判断的情况很少,那么几个简单的if else就足够用了。但是,如果进行逻辑判断的业务十分复杂,那么单单一个if判断是很难处理的,即便是处理了,代码也会闲的臃肿不堪。所以,责任链模式就派上用场了,每个逻辑判断都自成一体,既能处理复杂业务逻辑同时也便于扩展。
能
代码块
//责任链模式
public class Test {
//抽象责任链
abstract class Handler{
private Handler nextHandler;
public final void doHandler(int num){
if(num == number){
System.out.println("处理器" + this.getClass() + "处理");
}else{
if(this.nextHandler != null){
this.nextHandler.doHandler(num);
}else{
System.out.println("-----没有合适的处理器-----");
}
}
}
public void setNextHandler(Handler handler){
this.nextHandler = handler;
}
public int number;
}
//责任链实现A
class HandlerA extends Handler{
public HandlerA(){
this.number = 1;
}
}
//责任链实现B
class HandlerB extends Handler{
public HandlerB(){
this.number = 10;
}
}
//责任链实现C
class HandlerC extends Handler{
public HandlerC(){
this.number = 20;
}
}
//测试
public static void main(String[] args) {
Handler handlerA = new Test().new HandlerA();
Handler handlerB = new Test().new HandlerB();
Handler handlerC = new Test().new HandlerC();
handlerA.setNextHandler(handlerB);
handlerB.setNextHandler(handlerC);
//测试
handlerA.doHandler(50);
handlerA.doHandler(20);
handlerA.doHandler(10);
}
}
: 以上就是责任链模式的完整代码。Handler抽象类定义了处理方法,以及后续处理类的查找方法。子类:HandlerA,HandlerB,HandlerC构成链式的处理顺序。在测试代码中,我们分别对50,20,10这几个数字进行判断,结果显示分别是:没有合适的处理器,HandlerC处理,HandlerB处理。其实,这个责任链模式的处理流程,类似于数据结构中链表的遍历,而且开实际开发中,我们自定义的拦截器的执行过程,也与责任链模式有着类似的结构。
总结
优点
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
- 增加新的请求处理类很方便。
缺点
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
试用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求。