一、定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系
二、 责任链模式的使用场景
多个对象可以请求同一请求,但具体由哪个对象处理则在运行时候动态决定
在请求处理者不明确的情况下向多个对象中的一个提交一个请求
需要动态指定一组对象处理请求
责任链的UML
三、代码实现
定一个抽象的处理类 关键在与持有一个内部的自己引用
public abstract class Handler {
public Handler soccessor;
public abstract void handleRequest(String condition);
}
我们定义两个链条 大概是根据逻辑判断是自己要处理还是交给其他人处理,如果自己处理就自己处理掉 如果别人处理是别人处理掉
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("ConcreteHandler1")) {//可以是你要处理的方法
System.out.println("ConcreteHandler1 handler");
return;
} else {
if (soccessor != null) {
soccessor.handleRequest(condition);
}
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("ConcreteHandler2")) {//可以是你要处理的方法
System.out.println("ConcreteHandle2 handler");
return;
} else {
if (soccessor != null) {
soccessor.handleRequest(condition);
}
}
}
}
我们看在客户端 把所有链条都生产出来 然后给链条指定后前后关系,然后就在开始的链条上开始请求,因为如果有没有处理会进行下一环节,如果有处理那么就交给当前去处理
public class Client
@TestOnly
public void test() {
ConcreteHandler1 concreteHandler1 = new ConcreteHandler1();
ConcreteHandler2 concreteHandler2 = new ConcreteHandler2();
concreteHandler1.soccessor = concreteHandler2;
concreteHandler1.handleRequest("ConcreteHandler1");
}
}
四、优缺点
优点
降低耦合度。它将请求的发送者和接收者解耦
简化了对象,使得对象不需要知道链的结构
增强给对象指派职责的灵活性,允许动态地新增或者删除责任链
增加新的请求处理类方便
缺点
不能保证请求一定被接收;
系统性能将受到一定影响,调试时不方便,可能会造成循环调用