• JAVA中的责任链模式(CH02)


    对责任链CH01做出优化,解决耦合度太高问题

    记得上一篇我们使用的是抽象类,然后用子类去继承的方法实现等级的桥接,从而发现了耦合度太高。

      为了解决这个问题。

      我们本次使用接口进行抽象,然后使用到一个”中介“对所要申请的经费进行自动判断。

      这个类似于web的过滤器。让我们来Look一Look吧!

    一,首先我们创建一个接口,抽象出审批费用的方法

    public interface AbstractHandler {
        //抽象审批经费的方法,这里有两个参数
        //第一个参数是:申请经费
        //第二个参数是:处理链接的类,也就是中介
        void execute(int money,HandlerChain chain);
    
    }
    

    二,创建三个等级,分别实现AbstractHandler接口

    a) money<=200

    public class HandlerA implements AbstractHandler {
        @Override
        public void execute(int money,HandlerChain chain) {
            if(money<=200){//对经费进行判断
                System.out.println("A审核通过…………");
            }else{
                //如果审批权限不够,则去上一级领导申请,
                chain.doFilter(money);
            }
        }
    }

    b)money<=500

    public class HandlerB implements AbstractHandler {
        @Override
        public void execute(int money,HandlerChain chain) {
            if(money<=500){
                System.out.println("B审核可以通过…………");
            }else{
             chain.doFilter(money); } } }

     c)money<=1000

    public class HandlerC implements AbstractHandler {
        @Override
        public void execute(int money,HandlerChain chain) {
            if(money<=1000){
                System.out.println("C审核通过…………");
            }else{
                chain.doFilter(money);
            }
        }
    }

    三,最主要的是这个分配中介,也就是链接处理

    public class HandlerChain {
    
        //用来存放所有Handler实例 泛型是抽象接口
        private List<AbstractHandler> list= new ArrayList<AbstractHandler>();
    
        //定义一个迭代器,用来迭代list集合
        private Iterator<AbstractHandler> it;
    
        /**
         * 使用构造方法初始化责任链 解析XML文件
         * 将子类实例化添加到list里面
         */
        public HandlerChain(String resourcePath){
           init(resourcePath);
            it = list.iterator();
        }
      
      
    /**
         * 初始化容器
         */
        private void init(String resourcePath){
            //创建SAX解析器
            SAXReader reader = new SAXReader();
            try {
                //读取XML文件,并构建document对象
                Document doc = reader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath));
            
                //现在获取document的根元素
                Element root = doc.getRootElement();
                //获取所有子元素
                List<Element> childs = root.elements();    
                //遍历,解析子元素的属性
                for(Element e:childs){//获取class属性
                    String className = e.attributeValue("class");
                    //将信息放入容器中
                    childs.add(Class.forName(className).newInstance());
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
    
    
    /**
         * 对list里面的审批经费权限进行判断
         * @param money
         */
       public void doFilter(int money){
            if(it.hasNext()){//如果有下一个就执行
                //使用list里面被实例化过的方法,在这里子类方法里面有一个判断
                //如果审批成功这输出,如果审批经费超出权限,这回都这里执行下list里面的下一个子类方法;
                it.next().execute(money,this);
            }
       }
    
    
    }

    三,有了这个中介后,我们的主方法就可以减少过多的耦合了

    public class Main {
        public static void main(String[] args) {
            //实例化一个中介,在中介里面直接申请经费
          HandlerChain chain = new HandlerChain();
          chain.doFilter(50);
        }
    }

     XML文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans>
        <bean id="HandlerA" class="hadn.HandlerA" />
        <bean id="HandlerB" class="hadn.HandlerB" />
        <bean id="HandlerC" class="hadn.HandlerC" />
    </beans>
    

      

    输出结果:A审核通过…………

  • 相关阅读:
    cef 依赖的文件 libcef
    ubuntu 添加新分区,并挂载/home
    x509 证书链验证
    chromium调试
    Chromium智能指针使用指南
    具有扩展主密钥时SSL/TLS的主密钥计算
    OpenSSL解惑2:如何强制选择协议的版本
    基于Gmssl的SM2加解密算法Demo
    漫谈TLS nonce
    VS2015动态库静态加载时指定动态库位置的方法
  • 原文地址:https://www.cnblogs.com/javaLin/p/7886665.html
Copyright © 2020-2023  润新知