【设计模式与体系结构】行为型模式-责任链模式
简介
责任链模式(Chain Of Responsibility Pattern)允许沿着处理者链进行发送,避免请求者与发送者耦合在一起,每个处理者在收到请求后选择处理或者传递给下一个处理者,让多个对象都有接收到请求的可能性,这些对象形成链式结构,并且沿着这条链路传递请求,直至有对象处理请求。值得注意的是,责任链模式并不创建责任链,责任链的创建是由系统的其他部分完成的。
责任链模式的角色
- 抽象处理(Handler)者类:定义了一个处理请求的抽象方法,并持有一个指向下一个处理者的引用。
- 具体处理(Concrete Handler)者类:实现了抽象处理者的处理方法。在处理方法中,它可以根据具体条件决定是否处理请求,如果不处理则将请求传递给下一个处理者。
责任链模式的优点
- 请求者与处理者的解耦:请求者并不能直接确定请求最终是由谁进行处理,仅需要将请求发送到责任链上即可;
- 可扩展性好:链式结构,增删很容易,想要更改顺序也方便;
- 符合开闭原则:需要增加新的处理者类时,只需创建新的具体处理者类,并添加到责任链中即可,而无需修改原有代码。
责任链模式的缺点
- 请求可能不被处理:请求在责任链上可能没有处理者可以对其进行处理;
- 性能问题:责任链如果过长,那么请求在链上的传递会带来一定的性能消耗;
- 调试难度较高:由于请求可能在多个处理者之间传递,调试难度会稍大,可能需要跟踪处理整条责任链的逻辑。
责任链模式的使用场景
- 审批流程
- 拦截器或过滤器
- 事件处理系统
正文
定义一个抽象处理者类 Handler.java
public abstract class Handler {
protected Handler handler;
public void setNextHandler(Handler handler) {
this.handler = handler;
}
public abstract void handleRequest(int request);
}
定义具体处理者类 ConcreteHandler1.java
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequesr(int request) {
if (request < 5) {
System.out.println("ConcreteHandler1 处理了请求:" + request);
} else {
System.out.println("ConcreteHandler1 将请求传递给了 " + this.handler.getClass().getName());
this.handler.handleRequest(request);
}
}
}
定义具体处理者类 ConcreteHandler2.java
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(int request) {
if (request < 10) {
System.out.println("ConcreteHandler2 处理了请求:" + request);
} else {
System.out.println("ConcreteHandler2 将请求传递给了 " + this.handler.getClass().getName());
}
}
}
定义一个客户端
public class Client {
public static void main(String[] args) {
Handler concreteHandler1 = new ConcreteHandler1();
Handler concreteHandler2 = new ConcreteHandler2();
concreteHandler1.setNextHandler(concreteHandler2);
concreteHandler1.handleRequest(3);
concreteHandler1.handleRequest(8);
}
}
运行效果截图如下:

浙公网安备 33010602011771号