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"));
        }
    }



    运行结果:

    
    
    
    
    
    
    
    
    

  • 相关阅读:
    ORM之聚合和分组查询
    ORM之ManyToManyField操作
    ORM之ForeignKey操作
    ORM之一般操作
    ORM之元信息
    js浮点数的加减乘除
    如何用js去判断当前是否在微信中打开的链接页面
    Vue应用框架整合与实战--Vue技术生态圈篇
    图片纯前端JS压缩的实现
    js要怎么接收后端传的excel文件流?
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/9803162.html
Copyright © 2011-2022 走看看