写点什么

责任链模式

作者:EquatorCoco
  • 2024-12-19
    福建
  • 本文字数:1980 字

    阅读完需:约 6 分钟

​责任链(Chain of Responsibility)模式属于行为型模式的一种。


责任链模式是一种处理请求的模式,它让多个处理器都有机会处理该请求,直到其中某个处理成功为止。每个处理器都包含对下一个处理器的引用,从而形成链式结构。责任链模式把多个处理器串成链,然后让请求在链上进行传递。


财务审批就是一个责任链模式。拦截器(Interceptor)、过滤器(Filter)也是一种责任链,不但允许每个 Handler 有机会处理请求,还允许将请求传递给下一个 Handler。


责任链模式经常用在拦截、预处理请求。


责任链模式通常有以下组成部分:


  • 抽象处理者(Handler):定义了处理请求的接口,并提供设置下一个处理者的方法,一般是抽象类或接口。

  • 具体处理者(ConcreteHandler):实现了处理请求的逻辑。根据条件决定是否处理请求,或者将请求传递给下一个处理者。

  • 客户端(Client):创建并组装责任链,发出请求。


假设有一个系统需要处理不同级别的用户请求(例如普通用户、经理、总监)。每个级别的处理者只处理它能够处理的请求,无法处理的请求将传递给更高级别的处理者。


1、抽象处理者


// 抽象处理者abstract class Handler {    protected Handler nextHandler; // 下一个处理者
public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; }
// 抽象方法,处理请求 public abstract void handleRequest(int level);}
复制代码


2、具体处理者


// 具体处理者:普通用户处理者class UserHandler extends Handler {    @Override    public void handleRequest(int level) {        if (level <= 1) { // 普通用户只能处理等级为1的请求            System.out.println("UserHandler: Handling request with level " + level);        } else if (nextHandler != null) {            System.out.println("UserHandler: Cannot handle. Passing to next handler.");            nextHandler.handleRequest(level); // 转发请求        }    }}
// 具体处理者:经理处理者class ManagerHandler extends Handler { @Override public void handleRequest(int level) { if (level <= 2) { // 经理能处理等级为1和2的请求 System.out.println("ManagerHandler: Handling request with level " + level); } else if (nextHandler != null) { System.out.println("ManagerHandler: Cannot handle. Passing to next handler."); nextHandler.handleRequest(level); // 转发请求 } }}
// 具体处理者:总监处理者class DirectorHandler extends Handler { @Override public void handleRequest(int level) { if (level <= 3) { // 总监能处理等级1、2和3的请求 System.out.println("DirectorHandler: Handling request with level " + level); } else { System.out.println("DirectorHandler: Cannot handle. Request denied."); } }}
复制代码


3、客户端


// 客户端代码public class Client {    public static void main(String[] args) {        // 创建处理者        Handler userHandler = new UserHandler();        Handler managerHandler = new ManagerHandler();        Handler directorHandler = new DirectorHandler();
// 设置责任链:User -> Manager -> Director userHandler.setNextHandler(managerHandler); managerHandler.setNextHandler(directorHandler);
// 发出请求 System.out.println("Request with level 1:"); userHandler.handleRequest(1); // 普通用户处理
System.out.println("\nRequest with level 2:"); userHandler.handleRequest(2); // 经理处理
System.out.println("\nRequest with level 3:"); userHandler.handleRequest(3); // 总监处理
System.out.println("\nRequest with level 4:"); userHandler.handleRequest(4); // 无法处理 }}
复制代码


责任链模式的优缺点


优点:

  • 请求与处理者解耦:客户端无需关心请求是由哪个处理者处理的。

  • 灵活性高:可以动态组合处理者链条,扩展处理者非常方便。添加新的处理器或者重新排列处理器非常方便。

  • 职责划分明确:每个处理者专注于自己的职责,符合单一职责原则。


缺点:

  • 链条可能过长:如果链条过长,可能会影响性能。

  • 调试困难:链式结构可能使请求的流向不容易追踪。


行为型模式主要涉及算法和对象间的职责分配。行为型模式可以描述一组对象应该如何协作来完成一个整体任务。


文章转载自:烟沙九洲

原文链接:https://www.cnblogs.com/yanshajiuzhou/p/18616015

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
责任链模式_Java_EquatorCoco_InfoQ写作社区