设计模式之GOF23责任链模式
责任链模式chain of responsibility
将能够处理同一类请求的对象连成一条链,所提交的请求依次在链上传递,直到传递至有能力处理该请求的对象,不能则传给链上下一个
场景:
-打牌时
-奖学金审批
-请假审批
核心:是在客户端中才成链,也可以通过配置文件或者存在数组中加载
开发中常见场景:
-try catch异常链
-javascript语言中,事件的冒泡和捕获机制 Java语言中,事件处理采用观察者模式
-Servlet开发中,过滤器的链式处理
-Struts2中,拦截器的调用也是典型的链式处理
例子:工作中请假
0-3主任审批 3-10经理审批 10-30总经理审批
* 请假条
* @author 小帆敲代码
*
*/
private String empName;
private int leaveDays;
private String reason;
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public LeaveRequest(String empName, int leaveDays, String reason) {
this.empName = empName;
this.leaveDays = leaveDays;
this.reason = reason;
}
}
protected String leaderName;
protected Leader nextLeader;//责任链中的后继对象
public Leader(String leaderName) {
this.leaderName = leaderName;
}
//设置下一级领导
public void setNetLeader(Leader leader) {
this.nextLeader=leader;
}
//业务方法处理请假条
public abstract void handler(LeaveRequest leaveRequest) ;
}
super(leaderName);
}
public void handler(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays()<3) {
System.out.println("员工:"+leaveRequest.getEmpName()+",请假:"+leaveRequest.getLeaveDays()+",原因:"+leaveRequest.getReason());
System.out.println("主任:"+this.leaderName+",审核通过!");
}else {
if(this.nextLeader!=null) {
nextLeader.handler(leaveRequest);
}else {
System.out.println("此员工可能想辞职");
}
}
}
super(leaderName);
}
public void handler(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays()<10) {
System.out.println("员工:"+leaveRequest.getEmpName()+",请假:"+leaveRequest.getLeaveDays()+",原因:"+leaveRequest.getReason());
System.out.println("经理:"+this.leaderName+",审核通过!");
}else {
if(this.nextLeader!=null) {
nextLeader.handler(leaveRequest);
}else {
System.out.println("此员工可能想辞职");
}
}
}
super(leaderName);
}
public void handler(LeaveRequest leaveRequest) {
if(leaveRequest.getLeaveDays()<30) {
System.out.println("员工:"+leaveRequest.getEmpName()+",请假:"+leaveRequest.getLeaveDays()+",原因:"+leaveRequest.getReason());
System.out.println("总经理:"+this.leaderName+",审核通过!");
}else {
if(this.nextLeader!=null) {
nextLeader.handler(leaveRequest);
}else {
System.out.println("此员工可能想辞职");
}
}
}
Leader a=new Director("张三");
Leader b=new Manager("李四");
Leader c=new GeneralManager("王五");
//开始组织责任链
a.setNetLeader(b);
b.setNetLeader(c);
LeaveRequest req1=new LeaveRequest("TOM", 2, "抓JACK");
a.handler(req1);
}
设计模式之GOF23责任链模式相关推荐
- 简易理解设计模式之:责任链模式——OA中请假流程示例
介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...
- 《java设计模式》之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 设计模式-请假流程-责任链模式
责任链模式的定义 首先我们可以先看一下责任链模式的定义: Avoid coupling the sender of a request to its receiver by giving mo ...
- 设计模式探索之责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...
- Java描述设计模式(15):责任链模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...
- [设计模式-行为型]责任链模式(Chain of Responsibility)
概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一 ...
- 《JAVA设计模式系列》责任链模式
文章目录 责任链模式 责任链模式优缺点 应用场景 责任链模式的结构 实现流程 责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这 ...
- 【手写源码-设计模式15】-责任链模式-基于人事请假单工作流场景
1:主题拆解 ①基本介绍 ②人事请假单工作流模拟 ③责任链模式的优缺点 ④适用场景 ⑤应用实例 ⑥ASP.NET 管道模型 2:基本介绍 责任链模式很像异常的捕获和处理,当一个问题发生的时候,当前对象 ...
- [设计模式] javascript 之 责任链模式
责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...
- [Android设计模式之旅]——责任链模式
介绍 责任链模式(Chain of Responsibility Pattern)就是当我们发送一个请求后,沿着一个任务链执行,任务链上每个对象都能处理该请求,如果一个对象不处理,就会传递给下一个对象 ...
最新文章
- sdut 3345 哈夫曼编码 优先队列
- 全局变量-基本代码演练
- Boost多线程-替换MFC线程
- jQuery -- 光阴似箭(五):AJAX 方法
- 嵌入式 Linux下永久生效环境变量bashrc
- android 自定义progressbar demo,Android 自定义进度条ColorfulProgressbar,原理简单、效果还行...
- 体验微软反间谍软件及恶意软件清除工具
- mysql 删除了授权_mysql用户授权访问与删除授权
- iOS开发:几种静态扫描工具的使用与对比
- pycharm 里面配置pip,安装库
- 代码好味道、坏味道与重构
- win10解决无法远程桌面连接问题(参考)
- 深度学习中梯度消失原因、梯度爆炸及解决方案
- mxnet symbol 解析
- 10.curry 方法
- 分享:MSDN visual studio 2010简体中文旗舰版,专业版下载(内置正版密钥)
- [转帖]华为变革史(下)
- 手机电脑传文件?教你三种最简单的方法!
- 国产系统独创!Linux环境完美兼容原生安卓App
- Django-rest-framework框架之APIView与序列化详解
热门文章
- Oracle SQL优化原则
- [Selenium]怎样验证页面是否有无变化
- Javascript常用对象的属性和方法
- jquery学习笔记之选择器
- 《深入浅出struts》读书笔记(2)
- android 城市列表 横屏,Android Launcher3去掉所有应用列表,横屏时左右两侧的留空...
- python str 索引_一步一步学Python3(小学生也适用) 第九篇: 字符串(str)类型(中)...
- 拓端tecdat|matlab从ECG信号数据趋势项的消除
- [2] 图像处理之----二值化处理
- php阴影效果,css阴影效果:css边框阴影如何设置?