设计模式3-责任链模式

责任链模式 是一种行为设计模式 ,它允许你创建一个对象链。请求沿着这条链传递,直到有一个对象处理它为止。这种模式通常用于需要以某种方式动态地决定处理请求的顺序或方式的情况。

类图:

从图中可见最大的特点是AbstractHandler 它自己聚合了自己,也就是说AbstractHandler中又有一个AbstractHandler的成员属性。因为Java的实现就是用这种方式将所有Handler串成一条链。

时序图:

责任链模式包括以下主要组件:

1. 处理者(Handler)接口/抽象类

定义了处理请求的接口,通常包含一个处理请求的方法。具体的处理者(ConcreteHandler)实现该接口/抽象类,并负责处理请求,或者将请求传递给下一个处理者。

2. 具体处理者(ConcreteHandler)

实现了处理者接口/抽象类,并负责处理请求。如果它能够处理请求,则处理它;否则,将请求传递给下一个处理者。

3. 客户端(Client)

创建请求并将其发送到责任链的起始点。客户端不知道实际处理请求的对象是哪个,只需将请求发送到责任链即可。

责任链模式的优点包括:

  • 灵活性:可以动态地调整责任链的组织结构和顺序,以满足不同的需求。
  • 可扩展性:可以方便地添加新的处理者,而不影响现有的处理者和客户端代码。
  • 解耦性:请求发送者和请求处理者之间解耦,使得系统更易于维护和扩展。

一个简单的例子是,假设一个软件系统需要处理不同级别的问题(比如 Debug、Info、Warning、Error),每个级别对应一个处理者,它们按照严重程度的顺序组成责任链。当一个问题发生时,系统会将问题的级别传递给责任链的起始点,责任链会根据问题的级别逐级处理,直到找到合适的处理者。

代码:

java 复制代码
// 定义处理请求的接口
interface Handler {
    void handleRequest(String level);
}

// 具体处理者类
class DebugHandler implements Handler {
    @Override
    public void handleRequest(String level) {
        if (level.equals("Debug")) {
            System.out.println("Debug handler is handling the request.");
        } else {
            System.out.println("Debug handler cannot handle the request, passing to the next handler.");
        }
    }
}

class InfoHandler implements Handler {
    private Handler nextHandler;

    public InfoHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(String level) {
        if (level.equals("Info")) {
            System.out.println("Info handler is handling the request.");
        } else {
            System.out.println("Info handler cannot handle the request, passing to the next handler.");
            nextHandler.handleRequest(level);
        }
    }
}

class WarningHandler implements Handler {
    private Handler nextHandler;

    public WarningHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(String level) {
        if (level.equals("Warning")) {
            System.out.println("Warning handler is handling the request.");
        } else {
            System.out.println("Warning handler cannot handle the request, passing to the next handler.");
            nextHandler.handleRequest(level);
        }
    }
}

class ErrorHandler implements Handler {
    @Override
    public void handleRequest(String level) {
        if (level.equals("Error")) {
            System.out.println("Error handler is handling the request.");
        } else {
            System.out.println("Error handler cannot handle the request, it's the end of the chain.");
        }
    }
}

// 客户端类
public class Client {
    public static void main(String[] args) {
        // 创建责任链
        Handler debugHandler = new DebugHandler();
        Handler infoHandler = new InfoHandler(new WarningHandler(new ErrorHandler()));

        // 测试不同级别的请求
        debugHandler.handleRequest("Info");
        System.out.println("-----------------");
        infoHandler.handleRequest("Info");
        System.out.println("-----------------");
        infoHandler.handleRequest("Error");
    }
}

结果:

Debug handler cannot handle the request, passing to the next handler.


Info handler is handling the request.


Info handler cannot handle the request, passing to the next handler.

Warning handler cannot handle the request, passing to the next handler.

Error handler is handling the request.

应用场景:

责任链模式在实际应用中有许多使用场景,主要是在需要动态决定处理请求的顺序或方式的情况下。以下是一些常见的使用场景:

  1. 日志记录

在软件系统中,日志记录是一个常见的需求。责任链模式可以用于按照日志级别(如 Debug、Info、Warning、Error)的顺序处理日志消息,每个处理者负责记录特定级别的日志,如果某个处理者无法处理某个级别的日志,则将日志传递给下一个处理者。

  1. 请求过滤器

在 Web 开发中,可以使用责任链模式来实现请求过滤器链。每个过滤器负责执行一些特定的过滤逻辑,例如身份验证、日志记录、性能监控等,如果一个过滤器无法处理请求,则将请求传递给下一个过滤器。

  1. 事件处理

责任链模式也可以用于事件处理,其中每个处理者负责处理特定类型的事件。例如,图形用户界面中的事件处理可以构成责任链,其中每个组件都可以处理特定类型的事件,如果一个组件无法处理事件,则将事件传递给其父组件。

  1. 权限验证

在安全领域,责任链模式可以用于实现权限验证机制。每个处理者可以检查用户的权限,并决定是否允许执行特定操作,如果一个处理者无法确定用户的权限,则将请求传递给下一个处理者。

  1. 订单处理

在电子商务系统中,订单处理是一个复杂的过程,涉及到库存管理、支付处理、物流等。责任链模式可以用于将订单处理流程分解为多个处理者,每个处理者负责处理特定阶段的订单处理,如果一个处理者无法处理订单,则将订单传递给下一个处理者。

这些只是责任链模式的一些常见应用场景,实际上,责任链模式可以用于许多不同的领域和情景,只要存在一系列对象,每个对象都有可能处理请求,并且请求需要按照一定顺序传递。

结论:

责任链模式使用广泛 ,很常见。责任链模式的关键思想是将请求发送者和请求处理者解耦 ,每个处理者只关心自己能否处理请求,而不关心请求的具体内容或下一个处理者是谁。

相关推荐
用户0332126663679 小时前
将 HTML 转换为 Word:Java 自动化文档生成
java
天天摸鱼的java工程师9 小时前
Java 版 “国庆头像生成器”:8 年老开发的实用小工具
java·后端
亦良Cool9 小时前
如何部署一个Java项目
java·开发语言
徐子童9 小时前
优选算法---字符串
java·算法·字符串·笔试·高精度相乘
自由的疯9 小时前
java调chrome浏览器显示网页
java·前端·后端
kfepiza9 小时前
Spring 如何解决循环依赖 笔记251008
java·spring boot·spring
白水先森9 小时前
Python 字符串与布尔值详解
java·服务器·前端
kennylee269 小时前
WMS系统全景解析:从业务流到系统智能的深度设计
java·交通物流
往事随风去9 小时前
惊!多线程编程竟成内存杀手:90%程序员不知道的OOM陷阱
java·后端
vadvascascass9 小时前
平滑加权轮询负载均衡的底层逻辑
java·算法·负载均衡