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..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...
随机推荐
- eclipse连接mysql数据库实现怎删改查操作实例(附带源码)
package model; public class User { private int id; private String name; private String password; pub ...
- jquery 在页面上根据ID定位(jQuery锚点跳转及相关操作) 经典
1.锚点跳转简介 Edit 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+nam ...
- linux命令 网络篇
linux常用命令 netstat 语法(命令) 主要查看端口状态 netstat 语法 netstat -t/tcp 显示Tcp传输协议连线状况; netstat -u/udp 显示UDP传输协 ...
- 使用jsonp请求本地json文件
使用jsonp解决请求本地文件跨域问题 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- android studio/Intellij IDEA(MAC OSX)中android模拟器无法启动的一种原因
翻了stackoverflow上好多方式,各种重装重启清理缓存,都没有效果. 后来发现,用IDEA创建的模拟器的路径是 /Users/xirtam/.android/avd 而IDE使用的路径是 AN ...
- SPSS提示“列表中不允许存在字符串变量”的解决方法
点击 查看 菜单->变量->将需要修改为数字类型的列属性改为数字,还可以更改小数位数
- 3、LwIP协议栈规范翻译——概述
3.概述 像许多其他TCP/IP实现一样,分层协议设计已经成为设计lwIP实现的指南.每个协议实现为自己的模块,其中几个功能充当每个协议的入口点.尽管协议层是单独实现的,一些层却不全是,正如前面所叙述 ...
- bugfree3.0.1-邮件配置
系统内新建BUG或Case,或者BUG状态有修改时,这些操作都可以伴随邮件通知,提醒指派和抄送给对象及时关注. 配置方法 1.进入C:\xampp\htdocs\bugfree\protected\c ...
- java框架之MyBatis(2)-进阶&整合Spring&逆向工程
进阶内容 准备 jdbc.url=jdbc:mysql://192.168.208.192:3306/test?characterEncoding=utf-8 jdbc.driver=com.mysq ...
- [js]js设计模式-原型模式
构造函数模型- 对象的属性和方法每人一份 function createJs(name, age) { this.name = name; this.age = age; this.writeJs = ...