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



    运行结果:

    
    
    
    
    
    
    
    
    

  • 相关阅读:
    读取XML示例:C#获取XML的数据
    GridView不換行
    List<T> 的条件筛选 where使用方法
    [HDU] 1016 Prime Ring Problem
    [HDU] 1072 Nightmare 和HDU1180有点类似
    [HDU] 1180 诡异的楼梯个人觉得比较有趣的广搜索
    [HDU] 1312Red and Black 用广搜求能探寻到的点的数目
    [HDU] 1026 Ignatius and the Princess I 简单建模后广搜索求最短路径生成树
    [HDU] 1010 Tempter of the Bone最基本的深搜
    [HDU] 1175 连连看 剪枝优化后的性能飙升
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/9803162.html
Copyright © 2011-2022 走看看