对责任链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 id="HandlerA" class="hadn.HandlerA" />
<bean id="HandlerB" class="hadn.HandlerB" />
<bean id="HandlerC" class="hadn.HandlerC" />
</beans>

  

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

JAVA中的责任链模式(CH02)的更多相关文章

  1. JAVA中的责任链模式(CH01)

    责任链模式的关键在于每一个任务处理者都必须持有下一个任务处理者的作用 纯的责任链:纯的责任链是只能也必须只有一个任务处理者去处理这个任务,       不会出现没有处理者处理的情况,也不会出现有多个处 ...

  2. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  3. 如何在C#/.NET Core中使用责任链模式

    原文:Chain Of Responsbility Pattern In C#/.NET Core 作者:Wade 译者:Lamond Lu 最近我有一个朋友在研究经典的"Gang Of F ...

  4. java设计模式之责任链模式以及在java中作用

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

  5. JAVA设计模式之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  6. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  7. Java设计模式应用——责任链模式

    生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如 ...

  8. java设计模式之责任链模式(Chain of Responsibility)

    转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...

  9. Java设计模式之责任链模式、职责链模式

    本文继续介绍23种设计模式系列之职责链模式.   什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组.   职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...

随机推荐

  1. Luogu 1042 - 乒乓球 - [简单模拟]

    题目链接:https://www.luogu.org/problemnew/show/P1042 题目背景国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中 ...

  2. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  3. jQuery设置时间格式

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接

    Traceback (most recent call last): File "C:\Users\Administrator\AppData\Local\Programs\Python\P ...

  5. 43-2-CAN协议

    1.帧的种类 通信是通过以下 5 种类型的帧进行的. • 数据帧 • 遥控帧 • 错误帧 • 过载帧 • 帧间隔 另外, 数据帧和遥控帧有标准格式和扩展格式两种格式.标准格式有 11 个位的标识符(I ...

  6. 6、LwIP协议规范翻译——缓冲及内存管理

    6.缓冲及内存管理 在一个通信系统中,内存缓冲管理系统必须容纳各种大小的缓冲数据,其范围从包含具有数百个字节的数据的全尺寸TCP段到只有几个字节的短ICMP回复包.此外,为了避免拷贝,应该让数据内容缓 ...

  7. python练习题-员工信息表

    周末大作业:实现员工信息表文件存储格式如下:id,name,age,phone,job1,Alex,22,13651054608,IT2,Egon,23,13304320533,Tearcher3,n ...

  8. SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑

    SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC   原文:http://www.cnblogs.com/chenxizhang/arc ...

  9. JavaScript 数组插入元素并排序

    1.插入类排序 插入类排序的思想是:在一个已排好序的序列区内,对待排序的无序序列中的记录逐个进行处理,每一步都讲待排序的记录和已排好的序列中的记录进行比较,然后有序的插入到该序列中,直到所有待排序的记 ...

  10. Git 在 windows 上面的安装

    参考博客: https://blog.csdn.net/xiezhongyuan07/article/details/79411299 将该作者的文章搬过来, 大家可以直接看上面的原文章. 下面是拷贝 ...