《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设计模式学习记录-责任链模式
前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...
随机推荐
- Tengine zabbix 监控
Tengine 配置 在http 段下新增以下配置 req_status_zone server_stat "$host" 3M; server { listen 9008; lo ...
- 几个不同版本的framework改进
一些主要的演变过程及改进,还有很多部分不可能一一列出,下面是从1.1到4.0的一些主要改进: 一..NET Framework 1.1版本 1.ASP.NET移动控件 2.ADO.NET的改动 添加S ...
- 升级iOS10后http网页定位失效解决方案
最近我们在做项目时遇到这样一个新问题,用户在升级 iOS10 后,在 http 下使用 geolocation api 会报错,控制台输出 [blocked] Access to geolocatio ...
- Android -- Camera聚焦流程
Camera.java autoFocus()聚焦回调函数 @Override public void autoFocus() { //记录当前聚焦开始时间 mFocusStartTime = Sys ...
- Silverlight 之 断点调试
silverlight程序经常会遇到无法调试的情况,下面来总结解决方案. 一.问题描述 在Silverlight开发过程中,经常时不时的会碰到Silverlight无法调试的问题.如下几种情况: 1. ...
- IE下target获得焦点时存在虚线的问题
IE下target获得焦点时存在虚线时,用IE的特定属性:hidefocus="true"即可解决!
- PyQt5——安装Eric6
Eric6是PyQt编程最理想的IDE.windows版的安装很简单.下面的安装也是在windows上进行的.linux版的我安装有点问题,有时间再折腾. 下载: Eric6官网:http://eri ...
- 短信api接口
1.需要用到的结构 typedef struct _SM_PARAM { char SCA[16];//+8613552678753// 短消息服务中心号码(SMSC地址) char TPA[16]; ...
- MySQL事务控制语句(学习笔记)
MySQL事务控制语句(学习笔记) MySQL事务控制语句 在mysql命令行的默认下,事务都是自动提交的,sql语句提交后马上会执行commit操作.因此开启一个事务必须使用begi ...
- 【Docker】容器中找不到vi命令
在Docker容器中找不到vi命令 解决办法: 1.通过命令获取最新的软件包 apt-get-update 2.安装vi命令 apt-get install vim 安装过程中提示是否进行输入Y即可. ...