java中ch_JAVA中的责任链模式(CH02)

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

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

为了解决这个问题。

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

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

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

public interface AbstractHandler {

//抽象审批经费的方法,这里有两个参数

//第一个参数是:申请经费

//第二个参数是:处理链接的类,也就是中介

void execute(int money,HandlerChain chain);

}

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

a) money<=200

public class HandlerA implementsAbstractHandler {

@Overridepublic void execute(intmoney,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 implementsAbstractHandler {

@Overridepublic void execute(intmoney,HandlerChain chain) {if(money<=1000){

System.out.println("C审核通过…………");

}else{

chain.doFilter(money);

}

}

}

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

public classHandlerChain {//用来存放所有Handler实例 泛型是抽象接口

private List list= new ArrayList();//定义一个迭代器,用来迭代list集合

private Iteratorit;/*** 使用构造方法初始化责任链 解析XML文件

* 将子类实例化添加到list里面*/

publicHandlerChain(String resourcePath){

init(resourcePath);it=list.iterator();

}

/**

* 初始化容器*/

private voidinit(String resourcePath){//创建SAX解析器

SAXReader reader = newSAXReader();try{//读取XML文件,并构建document对象

Document doc =reader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath));//现在获取document的根元素

Element root =doc.getRootElement();//获取所有子元素

List childs =root.elements();//遍历,解析子元素的属性

for(Element e:childs){//获取class属性

String className = e.attributeValue("class");//将信息放入容器中

childs.add(Class.forName(className).newInstance());

}

}catch(Exception e) {throw newRuntimeException(e);

}

}

/*** 对list里面的审批经费权限进行判断

*@parammoney*/

public void doFilter(intmoney){if(it.hasNext()){//如果有下一个就执行//使用list里面被实例化过的方法,在这里子类方法里面有一个判断//如果审批成功这输出,如果审批经费超出权限,这回都这里执行下list里面的下一个子类方法;

it.next().execute(money,this);

}

}

}

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

public classMain {public static voidmain(String[] args) {//实例化一个中介,在中介里面直接申请经费

HandlerChain chain = newHandlerChain();

chain.doFilter(50);

}

}

XML文件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值