责任链模式

推荐分布式微服务电商源码

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

介绍

意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

何时使用:在处理消息的时候以过滤很多道。

如何解决:拦截的类都实现统一接口。

关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。

应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。

缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。

使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。

注意事项:在 JAVA WEB 中遇到很多应用。

实现

我们创建抽象类 AbstractLogger,带有详细的日志记录级别。然后我们创建三种类型的记录器,都扩展了 AbstractLogger。每个记录器消息的级别是否属于自己的级别,如果是则相应地打印出来,否则将不打印并把消息传给下一个记录器。

步骤 1

创建抽象的记录器类。

AbstractLogger.java

public abstract class AbstractLogger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;//责任链中的下一个元素protected AbstractLogger nextLogger;public void setNextLogger(AbstractLogger nextLogger){this.nextLogger = nextLogger;}public void logMessage(int level, String message){if(this.level <= level){write(message);}if(nextLogger !=null){nextLogger.logMessage(level, message);}}abstract protected void write(String message);}

步骤 2

创建扩展了该记录器类的实体类。

ConsoleLogger.java

public class ConsoleLogger extends AbstractLogger {public ConsoleLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("Standard Console::Logger: " + message);}
}

ErrorLogger.java

public class ErrorLogger extends AbstractLogger {public ErrorLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("Error Console::Logger: " + message);}
}

FileLogger.java

public class FileLogger extends AbstractLogger {public FileLogger(int level){this.level = level;}@Overrideprotected void write(String message) {    System.out.println("File::Logger: " + message);}
}

步骤 3

创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。每个记录器中的下一个记录器代表的是链的一部分。

ChainPatternDemo.java

public class ChainPatternDemo {private static AbstractLogger getChainOfLoggers(){AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger;  }public static void main(String[] args) {AbstractLogger loggerChain = getChainOfLoggers();loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information.");loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");}
}

步骤 4

执行程序,输出结果:

Standard Console::Logger: This is an information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is a debug level information.
Error Console::Logger: This is an error information.
File::Logger: This is an error information.
Standard Console::Logger: This is an error information.

SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之责任链模式相关推荐

  1. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之适配器模式

    适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的 ...

  2. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 分销商城 秒杀 高并发电商之策略模式

    策略模式 推荐分布式微服务电商源码 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象 ...

  3. SpringCloud SpringBoot uniapp vue b2b2c 微服务 多商家入驻直播带货商城 电商之14.0 Zookeeper 分布式锁实现原理

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式. 下面介绍 zookeeper 如何实现分布式锁,讲解排他锁和共享锁两类分布式锁. 排他锁 排他锁(Exclusive Locks),又被称为写 ...

  4. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Git 远程仓库(Github)

    Git 远程仓库(Github) 推荐电商源码 Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. ...

  5. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Maven教程

    Maven 教程 推荐电商源码 Maven 翻译为"专家"."内行",是 Apache 下的一个纯 Java 开发的开源项目.基于项目对象模型(缩写:POM)概 ...

  6. SpringCloud SpringBoot b2b2c 微服务 多商家入驻直播商城之Docker 架构

    Docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统.比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16 ...

  7. springboot 定时器_基于SpringCloud?+?SpringBoot的 SaaS型微服务脚手架源码分享

    简介: 基于SpringCloud(Hoxton.SR3) + SpringBoot(2.2.6.RELEASE) 的 SaaS型微服务脚手架,具备用户管理.资源权限管理.网关统一鉴权.Xss防跨站攻 ...

  8. java版SpringCloud+SpringBoot+mybatis+uniapp b2b2c 多商户入驻商城 直播商城 直播带货商城之行业管理

    1. 涉及平台 平台管理.商家端(PC端.手机端).买家平台(H5/公众号.小程序.APP端(IOS/Android).微服务平台(业务服务) 2. 核心架构 Spring Cloud.Spring ...

  9. 七十七、java版商城之直播短视频带货Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

    一个好的SpringCloud+SpringBoot b2b2c 电子商务平台涉及哪些技术.运营方案?以下是我结合公司的产品做的总结,希望可以帮助到大家! 搜索体验小程序:海哇 1. 涉及平台 平台管 ...

最新文章

  1. HDU 5729 Rigid Frameworks(连通性DP)
  2. ERP与EWM集成配置---ERP 端(一)
  3. 软件构造第三章 第五部分
  4. 你真的了解引用传递与值传递吗?
  5. mysql 英文占几个字符_MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚...
  6. java使用教程——组件及事件处理——窗口(设置窗口的颜色和背景)
  7. ubuntu 添加用户、用户组
  8. 线段树hdu1754
  9. E百科 | 第2期 扒一扒能加速互联网的QUIC协议
  10. 前端:CSS/13/HTML引入CSS的方法,CSS表格属性,盒子模型,上下外边距合并
  11. ThinkPHP5.0的访问路径随记
  12. 【Shell】sed实例之第三部分
  13. 《你有多少问题要请示》精华集粹
  14. 机器搜索引擎 vs 人肉搜索引擎(作者:胡宝介)
  15. 字节跳动 AI Lab 总监李航:语言模型的过去、现在和未来
  16. 谈产品的差异化思路:进可攻退可守
  17. 卷积,反卷积,空洞卷积
  18. 适用各大电商平台的商品主图设计模板!
  19. 万字报告拆解:Web3 浪潮风靡,NFT 找到新增长点,AIGC 如火如荼
  20. Android如何安全替换证书

热门文章

  1. Vmware ubuntu桥接方式联网
  2. JavaScript--简单案例
  3. 为什么 2 * (i * i) 比 2 * i * i 效率高?
  4. 2022美赛C题 预测模型
  5. 《Java解惑》系列——02字符谜题——谜题17:嗯??
  6. C++ 模板特化与偏特化
  7. 2022-9-18 simple class management system
  8. 【tensorflow】Input to reshape is a tensor with xxx values, but the requested shape requires a multipl
  9. etcd-集群部署,基于ssl认证的节点间通信,客户端基于ssl客户端证书访问。
  10. 人工智能发展的核心——机器学习