一起来学设计模式之责任链模式

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 前言目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~本节给大家讲一下设计模式中的责任链模式,并结合实际业务场景给大家讲解如何使用~本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~责任链模式责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它能够将请求从一系列处理者中进行传递,直到有一个处理者能够处理它。这个模式将请求的发送者和接收者分离开来,使多个处理对象都有机会处理请求,将这些处理对象串成一条链,并沿着这条链传递请求,直到有一个对象能够处理请求。

前言

目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

本节给大家讲一下设计模式中的责任链模式,并结合实际业务场景给大家讲解如何使用~

本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~

责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它能够将请求从一系列处理者中进行传递,直到有一个处理者能够处理它。这个模式将请求的发送者接收者分离开来,使多个处理对象都有机会处理请求,将这些处理对象串成一条链,并沿着这条链传递请求,直到有一个对象能够处理请求。

责任链模式的主要优点是降低了对象之间的耦合度增强了系统的可扩展性,同时也能够对请求进行动态的组合和修改。但缺点是每个请求都必须被处理,无法保证请求一定会被处理,而且有时会导致请求的处理链过长,影响系统性能。

  • 定义一个请求类Request,其中包含需要处理的请求信息和请求处理的结果。
public class Request {
    private String requestInfo;
    private String responseInfo;
    public Request(String requestInfo) {
        this.requestInfo = requestInfo;
    }
    public String getRequestInfo() {
        return requestInfo;
    }
    public void setResponseInfo(String responseInfo) {
        this.responseInfo = responseInfo;
    }
    public String getResponseInfo() {
        return responseInfo;
    }
}

  • 定义一个处理器接口Handler,其中包含处理请求的方法和设置下一个处理器的方法。
public interface Handler {
    void handleRequest(Request request);
    void setNextHandler(Handler nextHandler);
    Handler getNextHandler();
}
  • 实现处理器接口的具体处理器类,这些类分别处理不同的请求。如果自己无法处理,则将请求传递给下一个处理器。

public class ConcreteHandler1 implements Handler {
    private Handler nextHandler;
    @Override
    public void handleRequest(Request request) {
        if (request.getRequestInfo().contains("request1")) {
            request.setResponseInfo("response1");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
    @Override
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    @Override
    public Handler getNextHandler() {
        return nextHandler;
    }
}
public class ConcreteHandler2 implements Handler {
    private Handler nextHandler;
    @Override
    public void handleRequest(Request request) {
        if (request.getRequestInfo().contains("request2")) {
            request.setResponseInfo("response2");
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
    @Override
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    @Override
    public Handler getNextHandler() {
        return nextHandler;
    }
}
  • 将处理器按照一定的顺序组成责任链。
public class HandlerChain {
    private Handler firstHandler;
    public void addHandler(Handler handler) {
        if (firstHandler == null) {
            firstHandler = handler;
            return;
        }
        Handler temp = firstHandler;
        while (temp != null) {
            if (temp.getNextHandler() == null) {
                temp.setNextHandler(handler);
                break;
            }
            temp = temp.getNextHandler();
        }
    }
    public void handleRequest(Request request) {
        if (firstHandler != null) {
            firstHandler.handleRequest(request);
        }
    }
}

最佳实践

电商平台使用责任链模式的一个例子是订单支付流程。假设订单支付流程包括以下几个步骤:验证订单信息、验证用户信息、验证支付信息、扣款。这些步骤可以看作是一个责任链,每个步骤都可以处理请求,也可以将请求传递给下一个步骤。如果某个步骤无法处理请求,就将请求传递给下一个步骤,直到所有步骤都处理完毕或者有一个步骤处理成功为止。

以下是一个简单的订单支付流程的Java代码示例:

public abstract class PaymentHandler {
    protected PaymentHandler successor;
    public void setSuccessor(PaymentHandler successor) {
        this.successor = successor;
    }
    public abstract void handle(Payment payment);
}
public class OrderValidationHandler extends PaymentHandler {
    public void handle(Payment payment) {
        if (payment.getOrder() == null) {
            System.out.println("Order validation failed.");
            return;
        }
        System.out.println("Order validation passed.");
        if (successor != null) {
            successor.handle(payment);
        }
    }
}
public class UserValidationHandler extends PaymentHandler {
    public void handle(Payment payment) {
        if (payment.getUser() == null) {
            System.out.println("User validation failed.");
            return;
        }
        System.out.println("User validation passed.");
        if (successor != null) {
            successor.handle(payment);
        }
    }
}
public class PaymentValidationHandler extends PaymentHandler {
    public void handle(Payment payment) {
        if (payment.getPaymentMethod() == null) {
            System.out.println("Payment validation failed.");
            return;
        }
        System.out.println("Payment validation passed.");
        if (successor != null) {
            successor.handle(payment);
        }
    }
}
public class PaymentProcessingHandler extends PaymentHandler {
    public void handle(Payment payment) {
        System.out.println("Payment processing successful.");
    }
}
public class Payment {
    private Order order;
    private User user;
    private PaymentMethod paymentMethod;
    public Payment(Order order, User user, PaymentMethod paymentMethod) {
        this.order = order;
        this.user = user;
        this.paymentMethod = paymentMethod;
    }
    public Order getOrder() {
        return order;
    }
    public User getUser() {
        return user;
    }
    public PaymentMethod getPaymentMethod() {
        return paymentMethod;
    }
}
public class Client {
    public static void main(String[] args) {
        PaymentHandler orderValidationHandler = new OrderValidationHandler();
        PaymentHandler userValidationHandler = new UserValidationHandler();
        PaymentHandler paymentValidationHandler = new PaymentValidationHandler();
        PaymentHandler paymentProcessingHandler = new PaymentProcessingHandler();
        orderValidationHandler.setSuccessor(userValidationHandler);
        userValidationHandler.setSuccessor(paymentValidationHandler);
        paymentValidationHandler.setSuccessor(paymentProcessingHandler);
        Payment payment = new Payment(new Order(), new User(), new PaymentMethod());
        orderValidationHandler.handle(payment);
        userValidationHandler.handle(payment);
        paymentValidationHandler.handle(payment);
    }
}

输出:

Order validation passed.
User validation passed.
Payment validation passed.
Payment processing successful.
User validation passed.
Payment validation passed.
Payment processing successful.
Payment validation passed.
Payment processing successful.

在这个示例中,PaymentHandler是一个抽象类,它定义了一个successor成员变量和一个handle方法。successor成员变量保存了下一个处理步骤的PaymentHandler对象,handle方法用于处理请求。

结束语

设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲命令模式~

本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注鼓励一下呗~

相关文章

项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)






















相关文章
|
4天前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
4天前
|
设计模式
【设计模式】责任链模式
【1月更文挑战第27天】【设计模式】责任链模式
|
4天前
|
设计模式 Dubbo Java
聊聊Java设计模式-责任链模式
责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
86 1
聊聊Java设计模式-责任链模式
|
7月前
|
设计模式 C++
设计模式之责任链模式(C++)
设计模式之责任链模式(C++)
|
4天前
|
设计模式
设计模式之责任链模式
设计模式之责任链模式
|
4天前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
15 0
|
4天前
|
设计模式 Java 测试技术
浅谈设计模式 - 责任链模式(十四)
浅谈设计模式 - 责任链模式(十四)
52 0
|
4天前
|
设计模式 SQL Java
设计模式-责任链模式
设计模式-责任链模式
53 0
|
4天前
|
设计模式 Go 开发工具
Golang设计模式——11责任链模式
Golang设计模式——11责任链模式
22 0
Golang设计模式——11责任链模式
|
4天前
|
设计模式 前端开发
【设计模式】之责任链模式
职责链模式是一种非常有用的设计模式,在前端开发中经常用于处理复杂的请求流程和数据验证。它通过将请求发送者和接收者解耦,并将请求沿着一个链条依次传递下去,实现了优雅地处理请求流程。通过使用职责链模式,我们可以提高代码的可维护性和可扩展性。然而,在应用职责链模式时需要权衡其带来的优缺点,并根据具体情况进行选择。
46 0