责任链模式的高级用法

128 阅读2分钟

责任链模式是一种行为设计模式,它允许将请求沿一个由多个对象组成的处理链进行传递,直到某个对象能够处理请求为止。在高级用法中,可以使用责任链模式实现动态的链式处理,允许在运行时添加、移除或修改处理链中的处理器。

以下是一个具体的Java案例代码,演示了责任链模式的高级用法:

import java.util.ArrayList;
import java.util.List;

// 定义请求类
class Request {
    private String type;
    private String content;

    public Request(String type, String content) {
        this.type = type;
        this.content = content;
    }

    public String getType() {
        return type;
    }

    public String getContent() {
        return content;
    }
}

// 定义处理器接口
interface Handler {
    void setNextHandler(Handler handler);
    void handleRequest(Request request);
}

// 具体处理器实现类
class ConcreteHandler1 implements Handler {
    private Handler nextHandler;

    @Override
    public void setNextHandler(Handler handler) {
        nextHandler = handler;
    }

    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("Type1")) {
            System.out.println("ConcreteHandler1处理请求: " + request.getContent());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("无法处理该请求");
        }
    }
}

class ConcreteHandler2 implements Handler {
    private Handler nextHandler;

    @Override
    public void setNextHandler(Handler handler) {
        nextHandler = handler;
    }

    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("Type2")) {
            System.out.println("ConcreteHandler2处理请求: " + request.getContent());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("无法处理该请求");
        }
    }
}

class ConcreteHandler3 implements Handler {
    private Handler nextHandler;

    @Override
    public void setNextHandler(Handler handler) {
        nextHandler = handler;
    }

    @Override
    public void handleRequest(Request request) {
        if (request.getType().equals("Type3")) {
            System.out.println("ConcreteHandler3处理请求: " + request.getContent());
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("无法处理该请求");
        }
    }
}

public class ChainOfResponsibilityExample {
    public static void main(String[] args) {
        // 创建处理器实例
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();

        // 构建处理链
        handler1.setNextHandler(handler2);
        handler2.setNextHandler(handler3);

        // 创建请求
        Request request1 = new Request("Type1", "请求类型1");
        Request request2 = new Request("Type2", "请求类型2");
        Request request3 = new Request("Type3", "请求类型3");
        Request request4 = new Request("Type4", "请求类型4");

        // 处理请求
        handler1.handleRequest(request1);
        handler1.handleRequest(request2);
        handler1.handleRequest(request3);
        handler1.handleRequest(request4);
    }
}

**

在上述代码中,我们首先定义了一个Request类表示请求对象。然后,我们定义了一个Handler接口,其中包含了设置下一个处理器和处理请求的方法。接着,我们实现了三个具体的处理器类ConcreteHandler1ConcreteHandler2ConcreteHandler3,分别负责处理不同类型的请求。每个处理器类都会检查请求的类型,如果能够处理该类型的请求,则进行处理;否则,将请求传递给下一个处理器。最后,在main方法中,我们创建了处理器实例并构建了处理链,然后创建不同类型的请求并调用处理器进行处理。

运行以上代码将输出如下结果:

ConcreteHandler1处理请求: 请求类型1
ConcreteHandler2处理请求: 请求类型2
ConcreteHandler3处理请求: 请求类型3
无法处理该请求