责任链模式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"));
}
}
运行结果: