Java 设计模式:责任链模式

责任链模式是一种行为型设计模式,它通过将请求对象沿着一条链传递,直到被某个处理者处理完成。责任链模式可以减少请求的发送者和接收者之间的耦合,同时使得请求的处理者可以自由制定处理,增加系统的灵活性。

流程概述

以下是实现责任链模式的基本流程表:

步骤 描述
1 定义处理者接口
2 创建具体处理者
3 设置链路
4 发起请求

1. 定义处理者接口

我们首先要定义一个处理者接口,所有具体处理者都需要实现这个接口。

// Handler接口
public abstract class Handler {
    protected Handler nextHandler; // 下一个处理者

    // 设置下一个处理者
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    // 处理请求的方法
    public abstract void handleRequest(int request);
}

2. 创建具体处理者

接下来,创建几个具体处理者,这些处理者实现了预先定义的接口,并根据请求的条件执行处理。

// 处理请求的具体实现1
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("Handler A handling request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 处理请求的具体实现2
public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("Handler B handling request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 处理请求的具体实现3
public class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20) {
            System.out.println("Handler C handling request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

3. 设置链路

现在,我们需要创建一个“客户端”,来设置和启动责任链。

public class Client {
    public static void main(String[] args) {
        // 创建处理者
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        // 设置责任链
        handlerA.setNextHandler(handlerB);
        handlerB.setNextHandler(handlerC);

        // 发送请求
        handlerA.handleRequest(5);   // 输出: Handler A handling request: 5
        handlerA.handleRequest(15);  // 输出: Handler B handling request: 15
        handlerA.handleRequest(25);  // 输出: Handler C handling request: 25
    }
}

4. 发起请求

Client 类的 main 方法中,我们可以用不同的请求值来验证责任链的效果。不同的处理者会根据请求的大小进行相应的处理。

类图

以下是实现责任链模式的类图:

classDiagram
    class Handler {
        +nextHandler: Handler
        +setNextHandler(nextHandler: Handler): void
        +handleRequest(request: int): void
    }

    class ConcreteHandlerA {
        +handleRequest(request: int): void
    }

    class ConcreteHandlerB {
        +handleRequest(request: int): void
    }

    class ConcreteHandlerC {
        +handleRequest(request: int): void
    }

    Handler <|-- ConcreteHandlerA
    Handler <|-- ConcreteHandlerB
    Handler <|-- ConcreteHandlerC

流程图

以下是实施责任链模式的流程图:

flowchart TD
    A[定义处理者接口] --> B[创建具体处理者]
    B --> C[设置链路]
    C --> D[发起请求]

结尾

责任链模式是一种灵活且易于扩展的设计模式,它能够将请求的处理责任分派给多个处理者,并不需要客户了解处理者的具体实现。这使得系统更加模块化,降低了耦合性。通过本文的实施步骤和代码示例,相信你可以较好地理解责任链模式的基本概念和实现方法。巩固理解后,你可以进一步探索如何在实际项目中运用这一模式,以提升代码的可维护性和可扩展性。