对责任链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. Oracle课程档案,第十六天

    restore:恢复文件 recover: 恢复日志 丢失current日志组(正常关闭数据库):故障:SQL> select group#, status from v$log; 确认curr ...

  2. 四则运算第三次 PSP

     

  3. DATEADD日期函数的使用

    在当前日期加上几天:https://www.cnblogs.com/shitaotao/p/7648198.html 计算本月的第一天:https://www.cnblogs.com/lcyuhe/p ...

  4. vim正则表达式

    目录 一.使用正则表达式的命令[/,?, s, g] 1. 搜索命令 2. 替换命令s 3. global 命令形式 二.正则表达式的用法 表示位置的符号 表示数量的元字符 元字符一览 方括号内的特殊 ...

  5. VS统计项目代码行数

    ctrl + shift + F 输入:b*[^:b#/]+.*$ 选项图如下

  6. RoR- Database setup& SQLite ... Migrations

    *rails uses SQLite for database by default *Built-in command-line DB viewer *Self-contained,server-l ...

  7. MongoDB 备份(mongodump)与恢复(mongorestore)

    MongoDB  备份(mongodump)与恢复(mongorestore) 备份:使用mongodump命令导出所有数据库到指定目录 参数说明: --host:MongoDB所在服务器IP. -- ...

  8. Numpy float64和Python float是一样的

    >>> numpy.float64(5.9975).hex() # 函数用于将10进制整数转换成16进制,以字符串形式表示. '0x1.7fd70a3d70a3dp+2' >& ...

  9. IdentityServer4授权和认证集成Identity和profile

    identiyt的使用可以看之前的文章:https://www.cnblogs.com/nsky/p/10323415.html 之前的ids4授权服务器都是用的in-men方式把数据添加到内存, 现 ...

  10. python模拟面试技术题答案

      目录 Python4期模拟面试技术面试题答案............................................................................ ...