• 责任链模式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"));
        }
    }



    运行结果:

    
    
    
    
    
    
    
    
    

  • 相关阅读:
    cocos2dx中的精灵CCSprite
    Mark Russinovich 的博客:Windows Azure 主机更新:原因、时间和方式
    cocos2d-x中的尺寸之三
    cocos2d-x中的尺寸之二
    cocos2d-x中的尺寸之一
    cocos2d-x中的导演、场景、层和精灵
    宣布正式发布 Windows Azure 上的 Oracle 软件以及 Windows Azure Traffic Manager 更新
    Hello China操作系统STM32移植指南(三)
    Hello China操作系统STM32移植指南(二)
    diff_mysql_table_exec.py
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/9803162.html
Copyright © 2020-2023  润新知