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)应用场景相关推荐

  1. 【设计模式】—— 职责链模式ChainOfResponsibility

    模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因 ...

  2. 《研磨设计模式》chap23 职责链模式chainOfResponsibility(3)功能扩展+总结

    1. 扩展 功能链:某个链处理完继续向下传递. public class SaleModel {//销售的商品 private String goods;public String getGoods( ...

  3. 《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介

    场景:申请经费,有好几个领导审批,项目经理.部门经理.总经理,最后总会有一个人回复审批结果. 1. 正常编码 public class FeeRequest {//提交聚餐费用申请给项目经理 publ ...

  4. python设计模式案例分析_Python设计模式之职责链模式原理与用法实例分析

    本文实例讲述了Python设计模式之职责链模式原理与用法.分享给大家供大家参考,具体如下: 职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接 ...

  5. 设计模式之职责链模式应用例题

    设计模式之职责链模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 在军队中,一般根据战争规模的大小和重要性由不同级别的长官(Officer)来下达作战命令,情报人员向上级递交军 ...

  6. 【设计模式】职责链模式(C#)

    [设计模式]职责链模式 1.概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同.例如,公司员工请假或者加薪,可处理的领导有HR.部门负责人.副总经理. ...

  7. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 设计模式之职责链模式、减小了因为分支带来的耦合

    1. 定义 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一 ...

  9. 设计模式复习-职责链模式

    #pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...

最新文章

  1. 在同一台电脑上同时安装Python2和Python3
  2. HTTP协议详解 转自小坦克
  3. linux shell用户交互,鱼 - 一个明智的和用户友好的交互式shell为Linux
  4. Java:switch语句例子
  5. 如何绘制逻辑图 — 3.要素的属性:粒度与分层
  6. 云上远程运维的最后那点担心,“云梯”帮你解决
  7. asp.net服务器端对话框控件的简单实现(附源码)
  8. Get value from agent failed:cannot connect to[[192.168.1.113];10050]:[111]Co
  9. apply update from ADB
  10. PHP zip 文件压缩、解压
  11. 实现自定义Sql 注入器
  12. Log Parser Lizard 日志分析工具
  13. 女生找工作,非常有用,好好 收藏,以后肯定能用得上 (转)
  14. color.cpp:7456: error: (-215) scn == 3 || scn == 4 的解决办法
  15. Windows下使用GPU加速FFmpeg处理图片合成视频
  16. html点击出现表单弹窗
  17. Matlab报错错误使用symengine
  18. 使用VScode简易编程
  19. 我的那些年~小小少年~小屁孩
  20. mapboxGL中sprite生成与引用

热门文章

  1. Python 输入与输出
  2. 修改VMOS2的SID 并成为成员服务器,求助SAS9.4服务器版的sid!!!急急!
  3. icmp报文格式_IPV6报文格式和IPV4有什么区别?
  4. 什么是元宇宙?为何要关注它?
  5. 提高数据中心空间使用率,助力数字新基建
  6. opengl源码 实现无缝切换图片过场_手把手讲解 Android hook技术实现一键换肤
  7. Python编程语言学习:for循环中常用方法经验技巧(利用enumerate函数对列表实现自带索引等)之详细攻略
  8. 成功解决⑧NVIDIA安装程序无法继续 此NVIDL驱动程序与此Windows版本不兼容。 此图形驱动程序无法找到兼吝的图形硬件。
  9. DL之DCGNN:基于TF利用DCGAN实现在MNIST数据集上训练生成新样本
  10. 成功解决 from ._conv import register_converters as _register_converters