《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景
1. 初步实现
public abstract class Handler {//持有下一个处理请求的对象 protected Handler successor = null;//设置下一个处理请求的对象 public void setSuccessor(Handler successor){this.successor = successor;}//处理聚餐费用的申请 public abstract String handleFeeRequest(String user,double fee);
}public class DepManager extends Handler{ public String handleFeeRequest(String user, double fee) {String str = "";//部门经理的权限只能在1000以内if(fee < 1000){//为了测试,简单点,只同意小李申请的if("小李".equals(user)){str = "部门经理同意"+user+"聚餐费用"+fee+"元的请求";}else{//其他人一律不同意str = "部门经理不同意"+user+"聚餐费用"+fee+"元的请求";}return str;}else{//超过1000,继续传递给级别更高的人处理if(this.successor!=null){return this.successor.handleFeeRequest(user, fee);}}return str;}
}public class GeneralManager extends Handler{public String handleFeeRequest(String user, double fee) {String str = "";//总经理的权限很大,只要请求到了这里,他都可以处理if(fee >= 1000){//为了测试,简单点,只同意小李的if("小李".equals(user)){}else{//其他人一律不同意str = "总经理不同意"+user+"聚餐费用"+fee+"元的请求";}return str;}else{//如果还有后继的处理对象,继续传递if(this.successor!=null){return successor.handleFeeRequest(user, fee);}}return str;}
}
2. 功能扩展
两种请求,还有处理另外一种费用。
//定义职责对象的接口
public abstract class Handler {// 持有下一个处理请求的对象 protected Handler successor = null;//设置下一个处理请求的对象 public void setSuccessor(Handler successor){this.successor = successor;}//处理聚餐费用的申请 public abstract String handleFeeRequest(String user,double fee);//处理预支差旅费用的申请 public abstract boolean handlePreFeeRequest(String user,double requestFee);
}public class DepManager extends Handler{ public String handleFeeRequest(String user, double fee) {String str = "";//部门经理的权限只能在1000以内if(fee < 1000){//为了测试,简单点,只同意小李申请的if("小李".equals(user)){str = "部门经理同意"+user+"聚餐费用"+fee+"元的请求";}else{//其他人一律不同意str = "部门经理不同意"+user+"聚餐费用"+fee+"元的请求";}return str;}else{//超过1000,继续传递给级别更高的人处理if(this.successor!=null){return this.successor.handleFeeRequest(user, fee);}}return str;}public boolean handlePreFeeRequest(String user, double requestNum) {//部门经理的权限比较小,只能在20000以内if(requestNum < 20000){//工作需要嘛,统统同意System.out.println("部门经理同意"+user+"预支差旅费用"+requestNum+"元的请求");return true;}else{//超过20000,继续传递给级别更高的人处理if(this.successor!=null){return this.successor.handlePreFeeRequest(user, requestNum);}}return false;}
}public class Client {public static void main(String[] args) {//先要组装职责链 Handler h1 = new GeneralManager();Handler h2 = new DepManager();Handler h3 = new ProjectManager();h3.setSuccessor(h2);h2.setSuccessor(h1);//开始测试申请聚餐费用String ret1 = h3.handleFeeRequest("小李", 300);System.out.println("the ret1="+ret1);String ret2 = h3.handleFeeRequest("小李", 600);System.out.println("the ret2="+ret2);String ret3 = h3.handleFeeRequest("小李", 1200);System.out.println("the ret3="+ret3);//开始测试申请差旅费用h3.handlePreFeeRequest("小张", 3000);h3.handlePreFeeRequest("小张", 6000);h3.handlePreFeeRequest("小张", 32000);}
}
带来问题:老是要改接口。
3. 更好的方法
//定义职责对象的接口
public abstract class Handler { protected Handler successor = null; //持有下一个处理请求的对象//设置下一个处理请求的对象public void setSuccessor(Handler successor){this.successor = successor;}//通用的请求处理方法 public Object handleRequest(RequestModel rm){if(successor != null){//这个是默认的实现,如果子类不愿意处理这个请求,那就传递到下一个职责对象去处理return this.successor.handleRequest(rm);}else{System.out.println("没有后续处理或者暂时不支持这样的功能处理");return false;}}
}public class RequestModel {//表示具体的业务类型 private String type;//通过构造方法把具体的业务类型传递进来 public RequestModel(String type){this.type = type;}public String getType() {return type;}
}public class PreFeeRequestModel extends RequestModel{//约定具体的业务类型 public final static String FEE_TYPE = "preFee";public PreFeeRequestModel() {super(FEE_TYPE);}private String user; //申请人 private double fee; //申请金额public String getUser() {return user;}public void setUser(String user) {this.user = user;}public double getFee() {return fee;}public void setFee(double fee) {this.fee = fee;}
}//处理聚餐费用
public class DepManager extends Handler{public Object handleRequest(RequestModel rm){ if(FeeRequestModel.FEE_TYPE.equals(rm.getType())){return handleFeeRequest(rm);}else{return super.handleRequest(rm);}}private Object handleFeeRequest(RequestModel rm) {//先把通用的对象造型回来FeeRequestModel frm = (FeeRequestModel)rm;String str = "";//部门经理的权限只能在1000以内if(frm.getFee() < 1000){//为了测试,简单点,只同意小李申请的if("小李".equals(frm.getUser())){str = "部门经理同意"+frm.getUser()+"聚餐费用"+frm.getFee()+"元的请求";}else{//其他人一律不同意str = "部门经理不同意"+frm.getUser()+"聚餐费用"+frm.getFee()+"元的请求";}return str;}else{//超过1000,继续传递给级别更高的人处理if(this.successor!=null){return this.successor.handleRequest(rm);}}return str;}
}//处理预支差旅费用
public class DepManager2 extends DepManager{public Object handleRequest(RequestModel request){if(PreFeeRequestModel.FEE_TYPE.equals(request.getType())){//表示预支差旅费用申请return myHandler(request);}else{//其他的让父类去处理return super.handleRequest(request);}}private Object myHandler(RequestModel request) {//先把通用的对象造型回来PreFeeRequestModel fr = (PreFeeRequestModel)request;//部门经理的权限比较小,只能在20000以内if(fr.getFee() < 20000){//工作需要嘛,统统同意System.out.println("部门经理同意"+fr.getUser()+"预支差旅费用"+fr.getFee()+"元的请求");return true;}else{//超过20000,继续传递给级别更高的人处理if(this.successor != null){return this.successor.handleRequest(request);}}return false;}
}public class GeneralManager extends Handler{...
}public class GeneralManager2 extends GeneralManager{...
}public class Client {public static void main(String[] args) {//先要组装职责链 Handler h1 = new GeneralManager2();Handler h2 = new DepManager2();Handler h3 = new ProjectManager2();h3.setSuccessor(h2);h2.setSuccessor(h1);//开始测试申请聚餐费用FeeRequestModel frm = new FeeRequestModel();frm.setFee(300);frm.setUser("小李");//调用处理String ret1 = (String)h3.handleRequest(frm);System.out.println("ret1="+ret1);//重新设置申请金额,再调用处理frm.setFee(800); h3.handleRequest(frm);String ret2 = (String)h3.handleRequest(frm);System.out.println("ret2="+ret2);//重新设置申请金额,再调用处理frm.setFee(1600); h3.handleRequest(frm);String ret3 = (String)h3.handleRequest(frm);System.out.println("ret3="+ret3);//开始测试申请预支差旅费用PreFeeRequestModel pfrm = new PreFeeRequestModel();pfrm.setFee(3000);pfrm.setUser("小张");//调用处理h3.handleRequest(pfrm);//重新设置申请金额,再调用处理pfrm.setFee(6000);h3.handleRequest(pfrm);//重新设置申请金额,再调用处理pfrm.setFee(36000);h3.handleRequest(pfrm);}
}
《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景相关推荐
- 【设计模式】—— 职责链模式ChainOfResponsibility
模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...
- 《研磨设计模式》chap23 职责链模式chainOfResponsibility(3)功能扩展+总结
1. 扩展 功能链:某个链处理完继续向下传递. public class SaleModel {//销售的商品 private String goods;public String getGoods( ...
- 《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介
场景:申请经费,有好几个领导审批,项目经理.部门经理.总经理,最后总会有一个人回复审批结果. 1. 正常编码 public class FeeRequest {//提交聚餐费用申请给项目经理 publ ...
- python设计模式案例分析_Python设计模式之职责链模式原理与用法实例分析
本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接 ...
- 设计模式之职责链模式应用例题
设计模式之职责链模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军 ...
- 【设计模式】职责链模式(C#)
[设计模式]职责链模式 1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假或者加薪,可处理的领导有HR.部门负责人.副总经理. ...
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式之职责链模式、减小了因为分支带来的耦合
1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...
- 设计模式复习-职责链模式
#pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...
最新文章
- 在同一台电脑上同时安装Python2和Python3
- HTTP协议详解 转自小坦克
- linux shell用户交互,鱼 - 一个明智的和用户友好的交互式shell为Linux
- Java:switch语句例子
- 如何绘制逻辑图 — 3.要素的属性:粒度与分层
- 云上远程运维的最后那点担心,“云梯”帮你解决
- asp.net服务器端对话框控件的简单实现(附源码)
- Get value from agent failed:cannot connect to[[192.168.1.113];10050]:[111]Co
- apply update from ADB
- PHP zip 文件压缩、解压
- 实现自定义Sql 注入器
- Log Parser Lizard 日志分析工具
- 女生找工作,非常有用,好好 收藏,以后肯定能用得上 (转)
- color.cpp:7456: error: (-215) scn == 3 || scn == 4 的解决办法
- Windows下使用GPU加速FFmpeg处理图片合成视频
- html点击出现表单弹窗
- Matlab报错错误使用symengine
- 使用VScode简易编程
- 我的那些年~小小少年~小屁孩
- mapboxGL中sprite生成与引用
热门文章
- Python 输入与输出
- 修改VMOS2的SID 并成为成员服务器,求助SAS9.4服务器版的sid!!!急急!
- icmp报文格式_IPV6报文格式和IPV4有什么区别?
- 什么是元宇宙?为何要关注它?
- 提高数据中心空间使用率,助力数字新基建
- opengl源码 实现无缝切换图片过场_手把手讲解 Android hook技术实现一键换肤
- Python编程语言学习:for循环中常用方法经验技巧(利用enumerate函数对列表实现自带索引等)之详细攻略
- 成功解决⑧NVIDIA安装程序无法继续 此NVIDL驱动程序与此Windows版本不兼容。 此图形驱动程序无法找到兼吝的图形硬件。
- DL之DCGNN:基于TF利用DCGAN实现在MNIST数据集上训练生成新样本
- 成功解决 from ._conv import register_converters as _register_converters