前言
目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的责任链模式,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以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 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看