前言
目前正在出一个设计模式专题
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的责任链模式
,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以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 专题学习
- 利用docker搭建es集群
- 一起来学ElasticSearch(一)
- 一起来学ElasticSearch(二)
- 一起来学ElasticSearch(三)
- 一起来学ElasticSearch(四)
- 一起来学ElasticSearch(五)
- 一起来学ElasticSearch(六)
- 一起来学ElasticSearch(七)
- 一起来学ElasticSearch(八)
- 一起来学ElasticSearch(九)
- 一起来学ElasticSearch(十)
- 一起来学ElasticSearch之整合SpringBoot(一)
- 一起来学ElasticSearch之整合SpringBoot(二)
- 一起来学ElasticSearch之整合SpringBoot(三)
项目源码(源码已更新 欢迎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并行流有了解过吗?说说看
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
- springboot-all
地址
: github.com/qiuChenglei…- SpringBoot系列教程合集
- 一起来学SpringCloud合集
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(二)