一、概述

  为请求创建一个接收此次请求对象的链

  该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。

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

1.1、适用场景

  一个请求的处理需要多个对象当中的一个或几个协作处理

   1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

  2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

  3、可动态指定一组对象处理请求。

1.2、优缺点

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

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

1.3、类图角色及其职责

  

  职责链模式的角色和职责

  1、抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

  2、具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

1.4、演进过程

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

创建抽象的记录器类。

public abstract class AbstractLogger {
public static int DEBUG = 1;
public static int INFO = 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); }

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

ConsoleLogger

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

ErrorLogger

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

FileLogger

public class FileLogger extends AbstractLogger {

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

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

    private AbstractLogger getChainOfLoggers() {

        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.INFO);
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.DEBUG); errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger); return errorLogger;
}

测试

    @Test
public void logMessage() {
AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.DEBUG,
"This is a debug level information."); System.out.println("----------");
loggerChain.logMessage(AbstractLogger.INFO, "This is an information."); System.out.println("----------");
loggerChain.logMessage(AbstractLogger.ERROR,
"This is an error information.");
}

输出

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

二、扩展

应用例子:struts的拦截器、servlet的过滤器、Dubbo中的Filter、Mybatis中的Plugin

javax.servlet.Filter的doFilter、FilterChain

SpringSecurity

004-行为型-05-职责链模式(Chain of Responsibility)的更多相关文章

  1. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  2. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  3. 职责链模式(Chain of Responsibility)(对象行为型)

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  4. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  5. 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

  6. 行为型设计模式之职责链模式(Chain of Responsibility)

    结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...

  7. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

  9. 职责链模式(chain of responsibility Pattern)

    职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. •Handler: 抽象处理者:定义出一个 ...

  10. C#设计模式——职责链模式(Chain Of Responsibility Pattern)

    一.概述 在软件开发中,某一个对象的请求可能会被多个对象处理,但每次最多只有一个对象处理该请求,对这类问题如果显示指定请求的处理对象,那么势必会造成请求与处理的紧耦合,为了将请求与处理解耦,我们可以使 ...

随机推荐

  1. Python语言程序设计(3)--实例2-python蟒蛇绘制-turtle库

    1. 2. 3.了解turtle库 Turtle,也叫海龟渲染器,使用Turtle库画图也叫海龟作图.Turtle库是Python语言中一个很流行的绘制图像的函数库.海龟渲染器,和各种三维软件都有着良 ...

  2. .NET 中String 和StringBuilder 以及他们的区别

    stirng对象是不可变的,每次使用String类的方法进行运算时(赋值.拼接),都会在内存中生成新的字符串对象,这就要为新对象分配新的内存空间. StringBuilder 实例的 int Capa ...

  3. Linux命令基础6-mkdir命令

    mkdir是英文单词make directory的缩写.mkdir就是用来创建路径,一般就是用来创建文件夹的. 语法 mkdir (选项)(参数) 选项 -Z:设置安全上下文,当使用SELinux时有 ...

  4. wait,waitpid学习测试

    用man wait学习wait waitpid的使用 wait()函数功能:wait()函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回值是终止运行的子进程的PID. 参数status所 ...

  5. zmq使用记录

    zmq套接字介绍 https://www.cnblogs.com/fengbohello/p/4354989.html zmq示例 https://github.com/booksbyus/zguid ...

  6. spring mvc 坑之PUT,DELETE方法接收不到请求参数

    https://www.cnblogs.com/roobtyan/p/9576685.html 原因: Tomcat处理参数的问题: 1.将请求体中的数据,封装成一个map    2.request. ...

  7. [INS-07003] 访问 BeanStore 时出现意外错误

    oracle安装时出现以下问题: 原因:未配置环境变量CLASSPASH 解决方法:新增系统变量 变量名:CLASSPASH 变量值: .;%JAVA_HOME%\lib;%JAVA_HOME%\li ...

  8. [VSCode] Custom settings

    { // UI IMPROVEMENTS —————————————————— // Part 1. "editor.minimap.enabled": false, " ...

  9. (转载) 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)

    安装完之后别忘了还需要安装SSMS,这是坑爹的地方之二,干嘛不集成到SQL Server安装包里还要用户自己单独下载 下载地址:https://msdn.microsoft.com/en-us/lib ...

  10. 002_基础电路_AD快捷键

    AD快捷键设置 陆小果哥哥制作 1.      F2----------------------------------------放置走线 a)        b)       需设置,点中走线按住 ...