• 设计模式之责任链模式


        责任链模式在实际开发中属于比较常见的一种设计模式。假设我们要去某个公司面试,首先要到公司的前台打听,这时可能前台告诉你要去业务部门,这时你到了业务部门又被告知你应该去技术部门到了技术部门又被告知你应该去人事部门,因此最后我又不得不去人事部门。像这样,在我们找到合适的办事人之前,我们被不断地像皮球一样踢给一个有一个人,所以责任链模式也被叫做推卸责任模式。

        在程序开发中,当外部请求需要某个类处理时,但是当前类无法处理该请求就需要推卸责任,把请求交给下一个类来处理,像这样我们把多个对象组成了一条责任链,然后按照它们在链上的顺序一个一个的找出到底该由谁来负责处理。下面我们来用代码来解释如何使用责任链模式。

        首先定义一个抽象的处理器类Handler:

    public abstract class Handler {
        private Handler next;
    
        public Handler setNext(Handler next) {
            this.next = next;
            return this.next;
        }
        
        protected abstract boolean resolve();
        
        protected final void support(){
             if(resolve()){
                 return;
             }else if(this.next!=null){
                 this.next.support();
             }else{
                 System.out.println("谁也解决不了");
             }
        }
    }

    其中resolve方法需要子类去做具体的实现。

    定义三个具体的处理类:

    public class HandlerA extends Handler{
    
        @Override
        protected boolean resolve() {
            System.out.println("我是HandlerA,我处理不了");
            return false;
        }
    
    }
    
    
    public class HandlerB extends Handler{
    
        @Override
        protected boolean resolve() {
            System.out.println("我是HandlerB,我处理不了");
            return false;
        }
       
    }
    
    
    public class HandlerC extends Handler{
    
        @Override
        protected boolean resolve() {
            System.out.println("我是HandlerC,我处理了");
            return true;
        }
    
    }

    最后创建责任链并调用:

    public static void main(String[] args) {
        Handler hA = new HandlerA();
        Handler hB = new HandlerB();
        Handler hC = new HandlerC();
        hA.setNext(hB);
        hB.setNext(hC);
        hA.support();
        
    }

    控制台输出:

    我是HandlerA,我处理不了
    我是HandlerB,我处理不了
    我是HandlerC,我处理了

    
    

        在责任链模式中的核心就是Handler对象角色,它需要知道下一个处理者是谁并返回该对象。在实际的开发中,责任链模式比我今天举得例子要复杂的多,例如tomcat的过滤器和mybatis中的plugin,这个两个的实现方式和我今天所讲的实现方式不尽相同,我会在我以后的文章中介绍。

  • 相关阅读:
    第15.26节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QListWidget详解
    第二十一章、 Model/View便利类列表部件QListWidget详解
    PyQt(Python+Qt)学习随笔:QListWidget的信号简介
    iis日志存放位置 及 查看方法
    如何查看和分析IIS日志
    IIS网站设置禁止IP访问设置方法
    修改php默认的FastCGI模式为ISAPI模式的方法
    VPS/云主机CPU占用100%故障排查
    APACHE服务器httpd.exe进程占用cpu100%的解决方法
    httpd.exe占用100%CPU
  • 原文地址:https://www.cnblogs.com/suyang-java/p/10460089.html
Copyright © 2020-2023  润新知