关于责任链模式的优雅实现

关于责任链模式的优雅实现

目录

什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种常用的设计模式,它为请求创建了一个接收者对象的链。这种模式给予请求者一种将请求发送给一个对象并沿着这条链传递直到有一个对象处理它为止的方式。

责任链模式在开发中的应用

责任链模式在开发中有很多应用场景,例如日志记录、权限验证、过滤器等。它可以将复杂的业务逻辑拆分成多个独立的处理器,每个处理器负责处理特定类型的请求。

Java实现示例

下面是一个使用Java语言实现责任链模式的示例:


public interface Handler<T> {
    boolean handle(T context);

    default boolean isAsync() {
        return false;
    }

    default boolean logTrace() {
        return true;
    }
}


@Slf4j
public class CommonPipeline<T> {

    private List<Handler<T>> handlers = new LinkedList<>();
    private ExecutorService executorService;

    public CommonPipeline(int threadPoolSize) {
        this.executorService = new ThreadPoolExecutor(threadPoolSize, threadPoolSize * 2, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
    }

    public void addHandler(Handler<T> handler) {
        handlers.add(handler);
    }

这段代码定义了一个通用的管道类。它包含了一个处理器列表和一个执行器服务。构造函数接受一个线程池大小作为参数,并创建了一个线程池执行器。

管道类还包含了一个addHandler方法,用于向处理器列表中添加处理器。

接下来,让我们看一下管道类的execute方法:

public void execute(T context) {
        String pipelineId = UUID.randomUUID().toString();
        long startTime = System.currentTimeMillis();
        AtomicBoolean fastFail = new AtomicBoolean(false);

        log.info("Starting pipeline execution. Pipeline ID: " + pipelineId);

        for (Handler<T> handler : handlers) {
            if (fastFail.get()) {
                log.warn("Fast fail triggered. Stopping execution. Pipeline ID: " + pipelineId);
                break;
            }
            if (handler.logTrace()) {
                log.info("Executing handler: " + handler.getClass() + ". Pipeline ID: " + pipelineId);
            }

            try {
                if (handler.isAsync()) {
                    executorService.submit(() -> {
                        if (!handler.handle(context)) {
                            fastFail.set(true);
                        }
                    });
                } else {
                    if (!handler.handle(context)) {
                        log.warn("Handler " + handler.getClass().getSimpleName() + " failed. Stopping execution. Pipeline ID: " + pipelineId);
                        fastFail.set(true);
                        break;
                    }
                }
            } catch (Exception e) {
                log.error("An error occurred while executing handler: " + handler.getClass() + ". Pipeline ID: " + pipelineId, e);
                fastFail.set(true);
                break;
            }
        }

这个方法接受一个上下文对象作为参数,并执行管道中的所有处理器。它首先生成了一个唯一的管道ID,并记录了开始时间。然后,它初始化了一个快速失败标志。

在循环中,该方法遍历所有处理器,并检查快速失败标志是否已经触发。如果触发,则停止执行并退出循环。

对于每个处理器,该方法会检查是否需要记录跟踪信息。如果是,则记录当前正在执行的处理器。

然后,该方法会尝试执行当前处理器。如果处理器是异步的,则使用执行器服务提交任务;否则直接调用handle方法。

如果handle方法返回false,则表示当前处理器执行失败。此时,该方法会根据快速失败标志进行相应操作:如果快速失败标志已经触发,则停止执行并退出循环;否则继续执行下一个处理器。

在这段代码中,我们可以看到异步和快速失败两个重要概念。

异步指的是某些操作可以在后台运行而不阻塞主线程。在这个例子中,如果某个处理器是异步的,则它会被提交到线程池中运行而不阻塞主线程。

快速失败指的是当某个操作失败时立即停止整个流程而不再继续尝试其他操作。在这个例子中,如果某个处理器返回false或抛出异常,则整个管道会立即停止运行而不再尝试其他处理器。

希望这篇博客能够帮助你更好地理解责任链模式。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
责任链模式是一种行为设计模式,用于解耦发送请求者和处理请求者之间的关系。在责任链模式中,多个对象组成一条链,每个对象都有机会处理请求,如果一个对象不能处理该请求,则将该请求传递给下一个对象。该模式允许请求在链中的不同对象之间传递,直到找到一个能够处理该请求的对象为止。 在Java实现责任链模式的一种方法是使用一个基类接口定义处理请求的方法,然后每个具体的处理者都实现这个接口。接口中可以定义一个指向下一个处理者的引用,以便处理者可以将请求传递给下一个对象。 下面是一个使用Java实现责任链模式的示例: ```java // 定义一个处理请求的接口 interface Handler { void handleRequest(Request request); } // 具体的处理者类 class ConcreteHandler1 implements Handler { private Handler nextHandler; @Override public void handleRequest(Request request) { // 如果满足处理条件,则处理该请求,否则将请求传递给下一个处理者 if (request.getCondition()) { // 处理请求的代码 } else { nextHandler.handleRequest(request); } } // 设置下一个处理者 public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } } class ConcreteHandler2 implements Handler { private Handler nextHandler; @Override public void handleRequest(Request request) { // 如果满足处理条件,则处理该请求,否则将请求传递给下一个处理者 if (request.getCondition()) { // 处理请求的代码 } else { nextHandler.handleRequest(request); } } // 设置下一个处理者 public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } } // 请求类 class Request { private boolean condition; public boolean getCondition() { return condition; } } public class Main { public static void main(String[] args) { // 创建责任链 Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); handler1.setNextHandler(handler2); // 创建请求 Request request = new Request(); // 处理请求 handler1.handleRequest(request); } } ``` 在上面的示例中,我们定义了一个处理请求的接口`Handler`,并实现了两个具体的处理者类`ConcreteHandler1`和`ConcreteHandler2`。在`handleRequest`方法中,我们首先判断是否满足处理条件,如果满足则处理请求,否则将请求传递给下一个处理者。 在`Main`类中,我们创建了一个责任链,并设置了处理者的顺序。然后创建一个请求对象,并调用`handleRequest`方法开始处理请求。请求会沿着责任链依次传递,直到找到能够处理该请求的处理者为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coding小黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值