责任链模式为请求创建了一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者进行解耦。这种类型的设计模式属于行为模式。在这种模式下,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该对象,那么它会把相同的请求传给下一个接收者,以此类推

介绍

意图

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

解决问题

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

优点

降低耦合度

简化了对象。对象不需要知道链的结构

增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态的新增或者删除责任

增加新的请求处理类非常方便

缺点

不能保证请求一定被接受

系统性能将受到一定影响,可能会造成循环调用

可能不容易观察运行时特征,有碍于除错

实现

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

创建抽象的记录器类

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);

}

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

public class ConsoleLogger extends AbstractLogger {

public ConsoleLogger(int level){

this.level = level;

}

@Override

protected void write(String message) {

System.out.println("Standard Console::Logger: " + message);

}

}

public class ErrorLogger extends AbstractLogger {

public ErrorLogger(int level){

this.level = level;

}

@Override

protected void write(String message) {

System.out.println("Error Console::Logger: " + message);

}

}

public class FileLogger extends AbstractLogger {

public FileLogger(int level){

this.level = level;

}

@Override

protected void write(String message) {

System.out.println("File::Logger: " + message);

}

}

demo使用

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

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 an debug level information.");

loggerChain.logMessage(AbstractLogger.ERROR,

"This is an error information.");

}

}

执行程序,输出结果:

Standard Console::Logger: This is an information.

File::Logger: This is an debug level information.

Standard Console::Logger: This is an 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.

java语言描述一个行为_设计模式之责任链模式——Java语言描述相关推荐

  1. Java设计模式作业-责任链模式

    Java设计模式作业-责任链模式:Web过滤器 文章目录 前言 一.类图 二.代码及测试结果 1.Trouble类 2.Support类 3.CharSupport类 4.TypeTransformS ...

  2. Java设计模式之责任链模式(简单易懂)

    前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...

  3. 轻松学习Java设计模式之责任链模式

    我们的态度是:每天进步一点点,理想终会被实现. 前言 设计模式,可能很多人都是看到代码知道怎么回事,但是离开代码再让其说出来,估计就有点含糊其词了,包括我自己在内.Android中其实用到的设计模式也 ...

  4. Java设计模式之责任链模式(二)

    所有设计模式传送门 本文将一起介绍学习下设计模式之责任链模式.责任链模式是指使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有 ...

  5. Java设计模式系列--责任链模式(应用)

    原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...

  6. JAVA设计模式之责任链模式(职责链模式)

    转自JAVA设计模式之责任链模式(职责链模式)​​​​​​​ 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...

  7. 设计模式--责任链模式--Java实现

    设计模式–责任链模式–Java实现 责任链模式–链式数据结构–内存消耗–Java的awt事件一开始用责任链模式后来改为观察者模式–为什么呢?–现在的应用–dom事件–异常处理机制-过滤器链–等等 学习 ...

  8. 软件设计模式之责任链模式实验

    软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...

  9. 设计模式:责任链模式(Chain of Responsibility)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. 爬虫之xpath语法-节点修饰语法
  2. mysql分区和分表比较_MySQL分区和分表的区别与联系
  3. Expected image (JPEG, PNG, or GIF), got empty file
  4. DCMTK:从ASCII转储创建DICOM FileFormat或DataSet
  5. 在SAP WebIDE里开发一个React component
  6. Win7 x64 PL/SQL 连接 Oralce 提示 Could not initialize %ORACLE_HOME%\bin\oci.dll
  7. 【Python学习】win10+Anaconda3环境,安装phthon第三方库Jieba
  8. 连接MySql出现异常解决:java.sql.SQLException: The server time zone value is unrecognized or represents。
  9. 【科普】联邦知识蒸馏概述与思考
  10. MS SQL数据库备份和恢复存储过程
  11. php下的ssm模式,编码风格:Mvc模式下SSM环境,代码分层管理
  12. 涂上你的脸! 如何创建自定义Photoshop笔刷
  13. CAD如何绘制固定面积的矩形
  14. 电感式传感器的原理大白话
  15. 【果壳笔记】生物信息学——王秀杰老师部分
  16. 如何理解会议中控系统
  17. org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Could not find status of job:job_1649726530586_123811
  18. java软件更换皮肤怎么做_java窗体程序更换皮肤方法详细步骤
  19. 即将来临的Rails 4.0将放弃Ruby 1.8支持,改进后台任务、缓存等多项内容
  20. 笔划码、五笔码、拼音码软键盘中文输入

热门文章

  1. java executorser 停止_Java使用ExecutorService来停止线程服务
  2. Python【每日一问】21
  3. ChromeDriver启动Chrome浏览器后,地址栏只显示data;——chromeDriver版本不对
  4. Freemarker 内置函数 数字、字符串、日期格式化用法介绍
  5. Struts2学习入门
  6. 软件项目质量保证——编码规范
  7. Understand one Simple Factory Pattern
  8. SQL Server 2005 Express
  9. 文本分类 特征选取之CHI开方检验
  10. 第十六周博客作业西北师范大学|李晓婷