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



运行结果:









原文地址:https://www.cnblogs.com/ywbmaster/p/9803162.html