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

本文涉及的产品
检索分析服务 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⭐️)

博客(阅读体验较佳)






















相关文章
|
9月前
|
设计模式 Java
【设计模式系列笔记】责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它。每个处理者都有一个对下一个处理者的引用。责任链模式常用于处理请求的场景,例如在一个请求需要经过多个步骤或者多个对象来处理的情况下。
105 0
|
9月前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
9月前
|
设计模式
【设计模式】责任链模式
【1月更文挑战第27天】【设计模式】责任链模式
|
10天前
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理者链进行发送。每个处理者可以处理请求或将其传递给下一个处理者,从而实现解耦和灵活性。其结构包括抽象处理者(Handler)、具体处理者(ConcreteHandler)和客户端(Client)。适用于不同方式处理不同种类请求、按顺序执行多个处理者、以及运行时改变处理者及其顺序的场景。典型应用包括日志处理、Java Web过滤器、权限认证等。
47 13
「全网最细 + 实战源码案例」设计模式——责任链模式
|
3月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
53 3
|
4月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
66 9
|
3月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
39 0
|
3月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
49 0
|
4月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
24 0
|
4月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
49 0

热门文章

最新文章