JAVA中的责任链模式(CH02)

摘要:
我们优化了责任链CH01,以解决耦合过高的问题。请记住,在上一篇文章中,我们使用抽象类,然后使用子类来继承以实现级别桥接,因此我们发现耦合太高。

对责任链CH01做出优化,解决耦合度太高问题

记得上一篇我们使用的是抽象类,然后用子类去继承的方法实现等级的桥接,从而发现了耦合度太高。

  为了解决这个问题。

  我们本次使用接口进行抽象,然后使用到一个”中介“对所要申请的经费进行自动判断。

  这个类似于web的过滤器。让我们来Look一Look吧!

一,首先我们创建一个接口,抽象出审批费用的方法

public interface AbstractHandler {
    //抽象审批经费的方法,这里有两个参数
    //第一个参数是:申请经费
    //第二个参数是:处理链接的类,也就是中介
    void execute(int money,HandlerChain chain);

}

二,创建三个等级,分别实现AbstractHandler接口

a) money<=200

public class HandlerA implements AbstractHandler {
    @Override
    public void execute(int money,HandlerChain chain) {
        if(money<=200){//对经费进行判断
            System.out.println("A审核通过…………");
        }else{
            //如果审批权限不够,则去上一级领导申请,
            chain.doFilter(money);
        }
    }
}

b)money<=500

public class HandlerB implements AbstractHandler {
    @Override
    public void execute(int money,HandlerChain chain) {
        if(money<=500){
            System.out.println("B审核可以通过…………");
        }else{
         chain.doFilter(money); } } }

 c)money<=1000

public class HandlerC implements AbstractHandler {
    @Override
    public void execute(int money,HandlerChain chain) {
        if(money<=1000){
            System.out.println("C审核通过…………");
        }else{
            chain.doFilter(money);
        }
    }
}

三,最主要的是这个分配中介,也就是链接处理

public class HandlerChain {

    //用来存放所有Handler实例 泛型是抽象接口
    private List<AbstractHandler> list= new ArrayList<AbstractHandler>();

    //定义一个迭代器,用来迭代list集合
    private Iterator<AbstractHandler> it;

    /**
     * 使用构造方法初始化责任链 解析XML文件
     * 将子类实例化添加到list里面
     */
    public HandlerChain(String resourcePath){
       init(resourcePath);
        it = list.iterator();
    }
  
  
/**
     * 初始化容器
     */
    private void init(String resourcePath){
        //创建SAX解析器
        SAXReader reader = new SAXReader();
        try {
            //读取XML文件,并构建document对象
            Document doc = reader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath));
        
            //现在获取document的根元素
            Element root = doc.getRootElement();
            //获取所有子元素
            List<Element> childs = root.elements();    
            //遍历,解析子元素的属性
            for(Element e:childs){//获取class属性
                String className = e.attributeValue("class");
                //将信息放入容器中
                childs.add(Class.forName(className).newInstance());
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
/**
     * 对list里面的审批经费权限进行判断
     * @param money
     */
   public void doFilter(int money){
        if(it.hasNext()){//如果有下一个就执行
            //使用list里面被实例化过的方法,在这里子类方法里面有一个判断
            //如果审批成功这输出,如果审批经费超出权限,这回都这里执行下list里面的下一个子类方法;
            it.next().execute(money,this);
        }
   }


}

三,有了这个中介后,我们的主方法就可以减少过多的耦合了

public class Main {
    public static void main(String[] args) {
        //实例化一个中介,在中介里面直接申请经费
      HandlerChain chain = new HandlerChain();
      chain.doFilter(50);
    }
}

 XML文件

<?xml version="1.0" encoding="UTF-8"?>

<beans>
    <bean     />
    <bean     />
    <bean     />
</beans>

  

输出结果:A审核通过…………

免责声明:文章转载自《JAVA中的责任链模式(CH02)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP设计模式之装饰者模式sqoop2的相关配置,启动,停止命令(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

VirtualBox虚拟机下Windows登录密码破解方法(阿里云推荐码:1WFZ0V,立享9折!)

过去两年虚拟机的发展给开发者带来了极大的便利。要安装新环境,只需从其他人复制虚拟机文件即可。我以前在Ubuntu下工作,Windows偶尔也会使用它。所以我在Ubuntu VirtualBox下安装了Windows7。两天前,我在MacAir下打开了VirtualBox并启动了Win7虚拟机。在Win7登录界面输入密码后,系统提示我密码不正确。我只能在最初的...

codeforces 765 F Souvenirs 线段树+set

问题的含义:多个查询的间隔中两个数字之差的绝对值的最小值:可以根据查询的l对脱机查询进行排序,并且可以从r到l进行反向查询,并且间隔i+1到n的每次更新都可以确保此更新不会影响下一次和后续更新。因为当两个区间相互覆盖时,具有较小l的区间的值必须小于或等于另一个区间,因此可以绘制一个图来理解。...

ABB机器人功能程序(FUNC)

功能程序的应用范围非常广泛。熟练的人员可以根据不同的需求创建相应的功能程序。函数程序的固定格式是FUNC,返回结束。在ABB的学习中,许多学生对功能程序几乎一无所知,即使他们真的在使用它。在学习ABB的过程中,我遇到了几个用例,所以我总结了它们以加深我的理解。...

axios 学习文档

Axios是一个基于承诺的HTTP库,可以在浏览器和node.js中使用。执行POST请求axis.POST.then。接住执行多个并发请求函数getUserAccount(){returnaxios.get;}函数getUserPermissions(){returnaxios.get;}全部承诺。然后axios API可以通过传递相关配置来请求axios...

pycharm最新版本激活码(永久有效) python安装教程

输入python以查看当前版本的python。您可以输入“print'helloworld”并单击下载以启动PyCharm://pan.baidu.com//1eVdm4dUPKn3ZY_Xj kqNXw提取代码:l83f2,下载破解补丁(版本2018.3.5)下载链接至地址:...

Winform知识点

BringToFront()将控件移动到Z顺序的前面。...