对责任链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. react-redux简单实用

    首先了解一个过程,redux  肯定是通过在组件中出发一个方法(事件),我们可以实现一个简单的例子播放和停止播放(写到这今日心情不好,下次继续) redux需要安装 以下依赖:cnpm install ...

  2. nginx 禁止恶意域名解析

    server { listen default_server; server_name _; ssl on; ssl_certificate /etc/nginx/cert/aaaa.pem; ssl ...

  3. python全栈开发 * 22 面向对象 知识点汇总 * 180703

    22 面向对象 -----属性,类方法,静态方法,反射一.属性1.属性的定义:将方法伪装成属性,虽然在代码层面上没有任何高深之处,但让其看起来更合理. (类似于属性的方法)class Person: ...

  4. sql数据库光标变成黑快怎么回事?

    可能是因为你按到了insert键啦,你再按一下insert键应该就可以啦. 光标变成块状说明当前是覆盖模式.光标变成竖条状说明当前是插入模式.

  5. Gym 101194E / UVALive 7901 - Ice Cream Tower - [数学+long double][2016 EC-Final Problem E]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  6. 将lits集合转化为树状结构

    一,bean的类型: public class DeptListRES { /** * 子节点 */ private List<DeptListRES> children; private ...

  7. python的var_dump,打印对象内容

    from __future__ import print_function from types import NoneType __author__ = "Shamim Hasnath&q ...

  8. Intellij IDEA注册激活破解

    1.2017年适用(2016.3.5到2017.2.4版均生效) 安装IntelliJ IDEA 最新版 启动IntelliJ IDEA 输入 license时,选择输入 [License serve ...

  9. mybatis 转义

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...

  10. 【LeetCode每天一题】Word Search(搜索单词)

    Given a 2D board and a word, find if the word exists in the grid.The word can be constructed from le ...