场景:申请经费,有好几个领导审批,项目经理、部门经理、总经理,最后总会有一个人回复审批结果。

1. 正常编码

public class FeeRequest {//提交聚餐费用申请给项目经理 public String requestToProjectManager(String user,double fee){String str = "";if(fee < 500){//项目经理的权限比较小,只能在500以内str = this.projectHandle(user, fee);}else if(fee < 1000){//部门经理的权限只能在1000以内str = this.depManagerHandle(user, fee);}else if(fee >= 1000){//总经理的权限很大,只要请求到了这里,他都可以处理str = this.generalManagerHandle(user, fee);}return str;}//项目经理审批费用申请,参数、返回值和上面是一样的,省略了 private String projectHandle(String user, double fee) {String str = "";//为了测试,简单点,只同意小李的if("小李".equals(user)){str = "项目经理同意"+user+"聚餐费用"+fee+"元的请求";}else{//其他人一律不同意str = "项目经理不同意"+user+"聚餐费用"+fee+"元的请求";}return str;}//部门经理审批费用申请,参数、返回值和上面是一样的,省略了 private String depManagerHandle(String user, double fee) {String str = "";//为了测试,简单点,只同意小李申请的if("小李".equals(user)){str = "部门经理同意"+user+"聚餐费用"+fee+"元的请求";}else{//其他人一律不同意str= "部门经理不同意"+user+"聚餐费用"+fee+"元的请求";}return str;}//总经理审批费用申请,参数、返回值和上面是一样的,省略了 private String generalManagerHandle(String user, double fee) {String str = "";//为了测试,简单点,只同意小李的if("小李".equals(user)){str = "总经理同意"+user+"聚餐费用"+fee+"元的请求";}else{//其他人一律不同意str = "总经理不同意"+user+"聚餐费用"+fee+"元的请求";}return str;}
}public class Client {public static void main(String[] args) {FeeRequest request = new FeeRequest();//开始测试String ret1 = request.requestToProjectManager("小李", 300);System.out.println("the ret1="+ret1);        String ret2 = request.requestToProjectManager("小张", 300);System.out.println("the ret2="+ret2);String ret3 = request.requestToProjectManager("小李", 600);System.out.println("the ret3="+ret3);      String ret4 = request.requestToProjectManager("小张", 600);System.out.println("the ret4="+ret4);String ret5 = request.requestToProjectManager("小李", 1200);System.out.println("the ret5="+ret5);     String ret6 = request.requestToProjectManager("小张", 1200);System.out.println("the ret6="+ret6);}
}

抽象问题:客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的。还希望处理流程是可以灵活变动的,而处理请求的对象需要能方便地修改或者是被替换掉,以适应新的业务功能的需要。

2. 模式介绍

public abstract class Handler { protected Handler successor; //持有后继的职责对象 //设置后继的职责对象 public void setSuccessor(Handler successor) {this.successor = successor;}//持有后继的职责对象 示意处理请求的方法,虽然这个示意方法是没有传入参数,但实际是可以传入参数的,根据具体需要来选择是否传递参数 public abstract void handleRequest();
}public class ConcreteHandler1 extends Handler {public void handleRequest() {//根据某些条件来判断是否属于自己处理的职责范围//判断条件比如:从外部传入的参数,或者这里主动去获取的外部数据,//如从数据库中获取等,下面这句话只是个示意boolean someCondition = false;if(someCondition){//如果属于自己处理的职责范围,就在这里处理请求//具体的处理代码System.out.println("ConcreteHandler1 handle request");}else{//如果不属于自己处理的职责范围,那就判断是否还有后继的职责对象//如果有,就转发请求给后继的职责对象//如果没有,什么都不做,自然结束if(this.successor!=null){this.successor.handleRequest();}}}
}public class ConcreteHandler2 extends Handler {...
}public class Client {public static void main(String[] args) {//先要组装职责链Handler h1 = new ConcreteHandler1();Handler h2 = new ConcreteHandler2();h1.setSuccessor(h2);       //然后提交请求h1.handleRequest();}
}

《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介相关推荐

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

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

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

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

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

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

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

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

  5. 职责链( Chain of Responsibility)模式

    职责链( Chain of Responsibility)模式 职责链模式动机(Motivation) ➢在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指 ...

  6. 源码解析——FilterChain是职责链(过滤器)模式的典型应用

    源码解析 在javaWeb应用开发中,FilterChain是职责链(过滤器)模式的典型应用,以下是Filter的模拟实现分析: Request.java package com.itheima.pa ...

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

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

  8. 《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景

    1. 初步实现 public abstract class Handler {//持有下一个处理请求的对象 protected Handler successor = null;//设置下一个处理请求 ...

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

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

最新文章

  1. JavaScript 面向对象 (prototype 原型模式)
  2. php根据时间段分组,php按月分组(时间戳)
  3. eclipse CTRL+F Find/Replace使用正则表达式
  4. 当女朋友问你会不会出轨的时候,该怎么回答?
  5. arduinoesp8266定时器_ESP8266深度睡眠与Arduino IDE(NodeMCU)
  6. 376 Wiggle Subsequence 贪心解法以及证明
  7. 8个球放入3个盒子方式_盒子这样做皮薄如纸,不露馅超好吃,孩子一口气吃好几个...
  8. Java编译器和Java解释器---即时编译器和JAVA解释器
  9. 长焦拍照对比:小米10至尊纪念版和一加8 Pro、vivo X50 Pro+~~~~
  10. 双硬盘双win10互不干扰_双硬盘装WIN7 WIN10双系统
  11. 测试人员应看重「业务测试能力」
  12. FPGA(五):Quartus II 调用Fir IP核使用说明
  13. 微信小程序云开发之数据分页云函数
  14. 互连网、互联网、因特网、万维网、局域网、以太网 区别
  15. PDF文件压缩的简单方法
  16. 中缀表达式转后缀表达式详细思路及代码实现
  17. timus 1192. Ball in a Dream URAL 解题报告 平生第一个计算几何+高中物理
  18. Unity - 性能优化 - 包体,内存 - 偏静态资源的优化
  19. 设计师管理情绪 反复改_如何使用情绪板进行品牌标识设计
  20. Excel函数不生效的一种情况

热门文章

  1. icmp报文格式_IPV6报文格式和IPV4有什么区别?
  2. dio 上传文件报错_Vue+Element UI实现断点续传、分片上传、秒传
  3. 又一个高等级数据中心着火了!
  4. Gartner:基础设施和运营领域10大技术趋势
  5. 成功解决AttributeError: Parent variable ‘<Variable: ID (dtype = numeric)>‘ is not the index of entity En
  6. IDE之Eric:Python的IDE之eric的简介、安装、使用方法之详细攻略
  7. Py之seaborn:seaborn库的简介、安装、使用方法之详细攻略
  8. Py之gym:gym的简介、安装、使用方法之详细攻略
  9. js实现随机生成小方块
  10. tjoi2018D2T2(luogu4590) 游园会 (状压dp)