zoukankan      html  css  js  c++  java
  • 责任链模式2(委托者)

    责任链模式的升级

    仍然使用金额审批流程实例

    首先定一个任务处理接口:

    public interface Handler {
    
        /**
         * 抽象的任务处理方法
         * @param money 审批金额
         * @param chain 依赖一个链式处理器(委托者)
         */
        void execute(BigDecimal money,HandlerChain chain);
    }

    再定义三个处理实现类:

    public class AHandler implements Handler{
    
        @Override
        public void execute(BigDecimal money, HandlerChain chain) {
            if(money.doubleValue() <= 2000){
                System.out.println("AHandler 处理审批");
            }else{
                chain.execute(money);
            }
        }
    }

     

    public class BHandler implements Handler{
    
        @Override
        public void execute(BigDecimal money, HandlerChain chain) {
            if(money.doubleValue() <= 5000){
                System.out.println("BHndler 处理审批");
            }else{
                chain.execute(money);
            }
        }
    }

     

    public class CHandler implements Handler{
    
        @Override
        public void execute(BigDecimal money, HandlerChain chain) {
            if(money.doubleValue() <= 10000){
                System.out.println("CHandler 处理审批");
            }else{
                chain.execute(money);
            }
        }
    }

     

    再声明一个HandlerChain

    public class HandlerChain {
    
        /**
         * 声明一个迭代器
         */
        private Iterator<Handler> it;
    
        /**
         * 初始化所有的处理对象
         */
        public HandlerChain(){
        //定义一个集合
        /*List<Handler> chain = new ArrayList<>();
        chain.add(new HandlerA());
        chain.add(new HandlerB());
        chain.add(new HandlerC());
        iterable= chain.iterator();*/
    //使用ServiceLoader类在加载所有的实现类对象(服务类)
            //并返回一个迭代器,迭代器中存放的就是配置文件的所有实现类对象
            it = ServiceLoader.load(Handler.class).iterator();
        }
    
        /**
         * 链式处理
         * @param money
         */
        public void execute(BigDecimal money){
            if(it.hasNext()){
                it.next().execute(money, this);
            }
        }
    (服务类)在普通的java项目的src根目录下先创建一个固定包名为(META_INF.services),在创建一个文件实现类的全类名

    Main测试:

    public class Main {
        public static void main(String[] args) {
            TemplHandler chain = new TemplHandler();
            chain.execute(new BigDecimal("4000"));
        }
    }



    运行结果:

    
    
    
    
    
    
    
    
    

  • 相关阅读:
    Vue中this.$router.push(参数) 实现页面跳转
    vue elementui .eldialog 限制高度
    D Staircase Sequences 题解(思维)
    E Magical Ornament 题解(图论+状压dp)
    软件开发工具之五:“VisualStudio.NET部署应用程序”
    软件开发工具之二 :Power Designer
    软件开发工具之八 :Visio
    软件开发工具之九 :CVS
    软件开发工具之三:NUnit
    软件开发流程实例之一 :项目概述
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/9803162.html
Copyright © 2011-2022 走看看