对责任链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审核通过…………