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



    运行结果:

    
    
    
    
    
    
    
    
    

  • 相关阅读:
    [转]MyBatis传入多个参数的问题
    【转】赶集网mysql开发36军规
    C#套接字和windowsAPI套接字
    java中的注解
    java中的枚举类型
    过去的汇编代码
    近日错误集锦
    java swing模仿随机频谱
    java泛型中的对象
    XML-RPC远程方法调用
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/9803162.html
Copyright © 2011-2022 走看看