博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-责任链模式(17)
阅读量:6361 次
发布时间:2019-06-23

本文共 4125 字,大约阅读时间需要 13 分钟。

定义

责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。

责任链模式英文原话是:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving object and pass the request along the chain until an object handles it.

翻译:使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有对象处理它为止。

责任链模式的重点在“链上”,由一条链去处理相似的请求,在链中决定谁来处理这个请求,并返回相应的结果。

角色:

抽象处理者(Handler)角色:该角色对请求进行抽象,并定义一个方法来设定和返回对下一个处理者的引用。

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

/** * 抽象处理器 */public abstract class Handler {    //下一个处理器    private Handler nextHandler;    //处理方法    public abstract void handleRequest();    public Handler getNextHandler() {        return nextHandler;    }    public void setNextHandler(Handler nextHandler) {        this.nextHandler = nextHandler;    }}/** * 具体处理器. */public class ConcreteHandler extends Handler {    @Override    public void handleRequest() {        System.out.println(this.toString()+"处理器处理");        if (getNextHandler()!=null){   //判断是否存在下一个处理器            getNextHandler().handleRequest();   //存在则调用下一个处理器        }    }}/** * 测试 */public class Client {    public static void main(String[] args) {        Handler h1 = new ConcreteHandler();        Handler h2 = new ConcreteHandler();        h1.setNextHandler(h2);   //h1的下一个处理器是h2        h1.handleRequest();    }}

优点

  • 责任链模式将请求和处理分开,请求者不知道是谁处理的,处理者可以不用知道请求的全貌。
  • 提高系统的灵活性。

缺点

  • 降低程序的性能。每个请求都是从链头遍历到链尾,当链比较长的时候,性能会大幅下降。
  • 不易于调试。由于该模式采用了类似递归的方式,调试的时候逻辑比较复杂。

应用场景

责任链模式是一种常见的模式,Struts2的核心控件FilterDispatcher是一个Servlet过滤器,该控件就是采用责任链模式,可以对用户请求进行层层过滤处理。责任链模式在实际项目中的使用比较多,其典型的应用场景如下:

  • 一个请求需要一系列的处理工作。
  • 业务流的处理,例如文件审批。
  • 对系统进行扩展补充。
/** * 抽象处理器. */public abstract class AbstractLogger {    public static final int INFO = 1;    //一级日志    public static final int DEBUG = 2;   //二级日志包括一级    public static final int ERROR = 3;   //三级包括前两个    protected int level;    //责任链下一个元素    protected AbstractLogger nextLogger ;    public void setNextLogger(AbstractLogger nextLogger){        this.nextLogger = nextLogger;    }    //不同级别的记录方法不一样,这里给一个抽象的记录方法    abstract protected void write(String message);    //调用责任链处理器的记录方法.并且判断下一个责任链元素是否存在,若存在,则执行下一个方法.    public void logMessage(int level,String message){        if (this.level <= level){    //根据传进来的日志等级,判断哪些责任链元素要去记录            write(message);        }        if (nextLogger != null){            nextLogger.logMessage(level,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 FileLogger extends AbstractLogger {    public FileLogger(int level) {        this.level = level;    }    @Override    protected void write(String message) {        System.out.println("File Console::Logger"+message);    }}/** * error日志处理器. */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 ChainPatternDemo {    public 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 class Main {    public static void main(String[] args) {        AbstractLogger logger = ChainPatternDemo.getChainOfLoggers();        logger.logMessage(1,"一级日志记录");        System.out.println("--------------------------------");        logger.logMessage(2,"二级日志记录");        System.out.println("--------------------------------");        logger.logMessage(3,"三级日志记录");    }}

  

 

转载于:https://www.cnblogs.com/aeolian/p/8888958.html

你可能感兴趣的文章
python之倒序字符串
查看>>
Eclipse必备插件
查看>>
关于如何高效率开发一个Android App
查看>>
vsftpd服务及实现ftps
查看>>
细读shell-4
查看>>
linux 文件搜索2 find
查看>>
我的友情链接
查看>>
结对Review实施现状(看看团队怎么说)
查看>>
java中集合的继承结构图collection部分
查看>>
Nagios监控Dell服务器硬件状态
查看>>
Lync Server 2010迁移至Lync Server 2013部署系列 Part6:配置Office Web App 01
查看>>
firefox自带的开发着工具
查看>>
Linux ssh 安全配置
查看>>
linkedlist 最难题 Insert into a Cyclic Sorted List
查看>>
基于HAProxy+Varnish实现动静分离、负载均衡的高可用集群
查看>>
int转字符串 stringstream
查看>>
固态硬盘 相关知识 集锦
查看>>
Oracle 数据泵导入导出
查看>>
Windows 8 设置×××连接的方法
查看>>
python selenium webdriver启动chrome浏览器的方法
查看>>