JAVA中的责任链模式(CH02)
对责任链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)的更多相关文章
- JAVA中的责任链模式(CH01)
责任链模式的关键在于每一个任务处理者都必须持有下一个任务处理者的作用 纯的责任链:纯的责任链是只能也必须只有一个任务处理者去处理这个任务, 不会出现没有处理者处理的情况,也不会出现有多个处 ...
- Python使用设计模式中的责任链模式与迭代器模式的示例
Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...
- 如何在C#/.NET Core中使用责任链模式
原文:Chain Of Responsbility Pattern In C#/.NET Core 作者:Wade 译者:Lamond Lu 最近我有一个朋友在研究经典的"Gang Of F ...
- java设计模式之责任链模式以及在java中作用
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
- JAVA设计模式之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- Java设计模式应用——责任链模式
生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的. 在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作.如 ...
- java设计模式之责任链模式(Chain of Responsibility)
转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...
- Java设计模式之责任链模式、职责链模式
本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...
随机推荐
- JavaScript基础知识(三个判断、三个循环)
三个判断 if…else…只会执行其中一个条件 如果if条件中只有一个值,那么会默认转布尔: if(1=="1"){ // 当括号中条件为true时,执行此处的代码 console ...
- linux下yum安装及配置
1 2 3 4 分步阅读 公司使用的是linux搭建服务器,linux安装软件能够使用yum安装依赖包是一件非常简单而幸福的事情,所以这里简单介绍一下linux安装yum源流程和操作. 工具/原料 电 ...
- keepalived实现高可用
准备: 1.A-centos(192.168.6.177) 端口为9898的服务 2.B-ubuntu(192.168.6.182) 端口为9898的服务 3.keepalived安装包https ...
- PyQt5的安装及基本配置
安装PyQt5 注:Pyqt5只支持python3.5以上版本 Mac安装 Mac上使用编译安装的话,后面使用pyinstaller打包可能会出问题,推荐使用命令行一键安装,Linux如果包管理没有的 ...
- 【Linux】-NO.86.Linux.6.C.1.001-【CentOS 7 Install GCC】-
1.0.0 Summary Tittle:[Linux]-NO.86.Linux.6.C.1.001-[CentOS 7 Install GCC]- Style:Java Series:Log4j S ...
- #WEB安全基础 : HTTP协议 | 0x8 HTTP的Cookie技术
说道Cookie,你喜欢吃饼干吗? 这里的Cookie不是饼干=_= HTTP不对请求和响应的通信状态进行保存,所以被称为无状态协议,为了保持状态和协议功能引入了Cookie技术 Cookie技术在请 ...
- easy ui datatimebox databox 当前时间
databox 当前日期: class="easyui-datebox" var curr_time = new Date(); var strDate = curr_time. ...
- RxJava 详解——简洁的异步操作(一)
随着越来越多的人开始提及 RxJava ,鉴于 RxJava 目前这种既火爆又神秘的现状,写下这篇文章来对 RxJava 做一个相对详细的.针对 Android 开发者的介绍. 这篇文章的目的有两个: ...
- 使用SVN提交代码,快速简单的换地址方法
1.找到你项目所在的文档,然后删除.svn文件,如下图: 2.然后在使用小乌龟的图标,进行项目的导入,界面如下: 3.然后输入SVN库的地址,点击ok界面如下: 4.同步到eclipse的方法是,复制 ...
- Eclipse新建Java工程出现红色感叹号怎么解决?
安装了新版本的JDK之后,在Eclipse中新建Java工程出现红色感叹号怎么解决? 其实只要在Eclipse中重新设置一下JDK路径就行了 路径:右键Java工程>>Build Path ...