设计模式学习—责任链模式(Chain of Responsibility Design Pattern)

来源:互联网 发布:文件数据库 编辑:程序博客网 时间:2024/05/21 17:11

一、我的理解


责任链模式解耦请求的发送者和接收者。将同一个请求按照一条责任链的模式传递下去,责任链上的每个接收对象都可以根据自己定制的条件处理或者不处理该请求,同时将请求传递给下一个接收对象。有点类似流水线的工作方式。该方法与过滤器有点类似,但是过滤器强调的是筛选一部分对象,它并不会将同一个请求向下传递,而责任链中是同一个请求一直在责任链中传递。

这样做的话可以解耦请求的发送方和接收方,发送方只需要将请求发送给责任链的第一个接收对象即可,该对象可以选择处理请求或者不处理请求,传递请求或者终止责任链,依次类推,一直到最后一个对象输出结果或者抛出异常。


二、实现方式


定义一个抽象类或接口,责任链中的所有对象都实现了同一个方法,并在该方法中处理请求。然后责任链中除末尾的一个接收对象外,其他对象都维护有下一个接收对象的实例,通过调用规定的方法来将请求交给下一个对象。


三、实例



Java代码


AbstractLogger.java类:统一接口,所有接收对象中调用logMessage方法来处理请求

package com.study.dp.cor;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);}
ConsoleLogger.java文件:

package com.study.dp.cor;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文件:

package com.study.dp.cor;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文件:

package com.study.dp.cor;public class FileLogger extends AbstractLogger {public FileLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("File::Logger: "+message);}}
Demo.java文件:测试代码

package com.study.dp.cor;public class Demo {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.");System.out.println();loggerChain.logMessage(AbstractLogger.DEBUG, "This is a debug level information.");System.out.println();loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");System.out.println();}}


四、应用实例


1.JavaScript中的事件冒泡

2.JavaWeb中Tomcat对Encoding的处理

3.JSP Servlet中的Filter

阅读全文
0 0
原创粉丝点击