《java设计模式》之责任链模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
在以下条件下可考虑使用Chain of Responsibility:
1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2 你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3 可处理一个请求的对象集合应该被动态指定。
一个简单的例子:
abstract class Handler { private Handler nextHandler; public Handler getNextHandler() {
return nextHandler;
} public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
} public abstract void doHandler(); } class ConcreteHandler extends Handler { @Override
public void doHandler() { if (getNextHandler() != null) { System.out.println("还有责任链");
getNextHandler().doHandler();
} else { System.out.println("我自己处理" + toString());
} }
}
既然为设计模式,必然有其鲜明代码的主体框架,我们来分析下
首先定义一个抽象的处理角色Handler ,其次是具体实现类ConcreteHandler ,在ConcreteHandler 我们通过getNextHandler()来判断是否还有下一个责任链,如果有,则继续
传递下去,调用getNextHandler().doHandler()来实现。
分析了简单的责任链模式的代码框架之后,我们接下来给代码加点实际的功能,举个很简单的例子,就是报销流程,项目经理<部门经理<总经理
其中项目经理报销额度不能大于500,则部门经理的报销额度是不大于1000,超过1000则需要总经理审核
abstract class ConsumeHandler { private ConsumeHandler nextHandler; public ConsumeHandler getNextHandler() {
return nextHandler;
} public void setNextHandler(ConsumeHandler nextHandler) {
this.nextHandler = nextHandler;
} /** user申请人 free报销费用 */
public abstract void doHandler(String user, double free); }
//项目经理
class ProjectHandler extends ConsumeHandler { @Override
public void doHandler(String user, double free) {
if (free < 500) { if (user.equals("lwx")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
} } else {
if (getNextHandler() != null) { getNextHandler().doHandler(user, free);
}
} }
}
//部门经理
class DeptHandler extends ConsumeHandler { @Override
public void doHandler(String user, double free) {
if (free < 1000) { if (user.equals("zy")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
} } else {
if (getNextHandler() != null) { getNextHandler().doHandler(user, free);
}
} }
}
//总经理
class GeneralHandler extends ConsumeHandler { @Override
public void doHandler(String user, double free) {
if (free >=1000) { if (user.equals("lwxzy")) {
System.out.println("给予报销:" + free);
} else {
System.out.println("报销不通过");
} } else {
if (getNextHandler() != null) { getNextHandler().doHandler(user, free);
}
} }
}
测试下
public static void main(String[] args) { /*ConcreteHandler handler1 = new ConcreteHandler();
ConcreteHandler handler2 = new ConcreteHandler();
handler1.setNextHandler(handler2);
handler1.doHandler();*/ ProjectHandler projectHandler =new ProjectHandler();
DeptHandler deptHandler =new DeptHandler();
GeneralHandler generalHandler =new GeneralHandler();
projectHandler.setNextHandler(deptHandler);
deptHandler.setNextHandler(generalHandler);
projectHandler.doHandler("lwx", 450);
projectHandler.doHandler("lwx", 600);
projectHandler.doHandler("zy", 600);
projectHandler.doHandler("zy", 1500);
projectHandler.doHandler("lwxzy", 1500);
}
执行结果
给予报销:450.0
报销不通过
给予报销:600.0
报销不通过
给予报销:1500.0
拓展联想:模拟实现servlet过滤器中字符和登陆过滤器的实现
关于tomcat中责任链的使用:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html
《java设计模式》之责任链模式的更多相关文章
- Java设计模式十九——责任链模式
责任链模式 老李的苦恼 每个人在出生的时候,都早已在暗中被标好了三六九等. 老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事.在他们的心中,谁当老爷都没有区别, ...
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- Python的组合模式与责任链模式编程示例
Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...
- Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式
模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请 ...
- Java设计模式系列之责任链模式
责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...
- Java常见设计模式之责任链模式
原文地址: http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开 ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击
- Java设计模式学习记录-责任链模式
前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...
随机推荐
- Singleton 单例模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 用C#代码编写的SN快速输入工具
一般软件都要输入序列号(SN),而大家平时用的最多的恐怕是盗版软件,通常盗版软件的序列号(SN)都保存成:XXXXX-XXXXX-XXXX-XXXX的形式. 而软件输入序列号的地方通常都是几个文本框( ...
- WordPress 无法使用the_content()方法输出内容
在使用WordPress里在一个页面里我使用the_content()方法来输出当前页面的内容,但却显示为空,而标题,url等都没有问题 在网络上好像遇到这种情况的人很少只找到了一个说是可能是func ...
- (转)Unity3D占用内存太大的解决方法
自:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. ...
- [Angular-Scaled web] 2. Architecture sub-modules
Common models will be a sub models for category and bookmarks. Because they are used everywhere. For ...
- C++ Linux 多线程之创建、管理线程
线程就是,在同一程序同一时间内同意运行不同函数的离散处理队列. 这使得一个长时间去进行某种特殊运算的函数在运行时不阻碍其它的函数变得十分重要. 线程实际上同意同一时候运行两种函数,而这两个函数不必相互 ...
- Linux/Unix分配进程ID的方法以及源代码实现
在Linux/Unix系统中.每一个进程都有一个非负整型表示的唯一进程ID.尽管是唯一的.可是进程的ID能够重用.当一个进程终止后,其进程ID就能够再次使用了. 大多数Linux/Unix系统採用延迟 ...
- iOS 应用上传所需 Icon图片大小
iPhone-only Apps Include the following in your application's Resources group in the Xcode project: T ...
- Java从零开始学零(Java简介)
一.Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年 ...
- 算法笔记_193:历届试题 连号区间数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R ...