一、职责链模式
1、UML图

2、代码:
Handler类:定义一个处理请示的接口。
ConcreteHandler类:具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。
ConcretelHandler1类:当请求数在0到10之间则有权处理,否则转到下一位。
ConcreteHandler2类:当请求数在10到20之间则有权处理,否则转到下一位。
ConcreteHandler3类:当请求数在20到30之间则有权处理,否则转到下一位。

abstract class Handler{protected String name;protected Handler successor;//设置继任者public void SetSuccessor(Handler successor) {this.successor=successor;}public abstract void HandleRequest(int request);public String getName() {return name;}public void setName(String name) {this.name = name;}}
class ConcreteHandler1 extends Handler{@Overridepublic void HandleRequest(int request) {// TODO Auto-generated method stubif(request>=0&&request<10) {System.out.println(this.getName()+"处理请求"+request);}else if(successor!=null) {successor.HandleRequest(request);}}}
class ConcreteHandler2 extends Handler{@Overridepublic void HandleRequest(int request) {// TODO Auto-generated method stubif(request>=10&&request<20) {System.out.println(this.getName()+"处理请求"+request);}else if(successor!=null) {successor.HandleRequest(request);}}}
class ConcreteHandler3 extends Handler{@Overridepublic void HandleRequest(int request) {// TODO Auto-generated method stubif(request>=20&&request<30) {System.out.println(this.getName()+"处理请求"+request);}else if(successor!=null) {successor.HandleRequest(request);}}}
public  class Main{public static void main(String[] args){Handler h1=new ConcreteHandler1();h1.setName("审批人1");Handler h2=new ConcreteHandler2();h2.setName("审批人2");Handler h3=new ConcreteHandler3();h3.setName("审批人3");h1.SetSuccessor(h2);h2.SetSuccessor(h3);int[]requests= {2,5,14,22,18,3,27,20};for(int i=0;i<requests.length;i++) {h1.HandleRequest(requests[i]);}}
}
//结果为:
审批人1处理请求2
审批人1处理请求5
审批人2处理请求14
审批人3处理请求22
审批人2处理请求18
审批人1处理请求3
审批人3处理请求27
审批人3处理请求20

优点:

  • 请求者和接收者松散耦合
  • 动态组合职责

缺点:

  • 产生很多细粒度对象
  • 不一定能被处理

二、实例

1、问题背景
加薪申请、上报与审批员工向经理发起加薪申请,经理无权决定,需要向总监汇报,如果加薪额度超过总监权力范围,需要向总经理汇报。员工还可以提交请假申请,经理可以决定2天以下的假,总监可以决定5天以下的假,其余都要上报总经理。
2、初步代码

//申请:小菜请求加薪2000/小菜请假3天
class Request{private String requestType;//申请类别private String requestContent;//申请内容private int number;//数量public String getRequestType() {return requestType;}public void setRequestType(String requestType) {this.requestType = requestType;}public String getRequestContent() {return requestContent;}public void setRequestContent(String requestContent) {this.requestContent = requestContent;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}}
//管理者
class Manager{protected String name;public Manager(String name) {this.name=name;}public void GetResult(String managerLevel,Request request) {System.out.println(request.getRequestType()+":"+request.getNumber());if(managerLevel=="经理") {if(request.getRequestType()=="请假"&&request.getNumber()<=2) {System.out.println("数量<=2,被批准");}else {System.out.println("数量>2,无权批准");}}else if(managerLevel=="总监") {if(request.getRequestType()=="请假"&&request.getNumber()<=5) {System.out.println("数量<=5,被批准");}else {System.out.println("数量>5,无权批准");}}else if(managerLevel=="总经理") {if(request.getRequestType()=="请假") {System.out.println("请假,被批准");}else if(request.getRequestType()=="加薪"&&request.getNumber()<=500) {System.out.println("加薪<=500,被批准");}else if(request.getRequestType()=="加薪"&&request.getNumber()>500) {System.out.println("加薪>500,无权批准");}}}
}
public  class Main{public static void main(String[] args){Manager jinli=new Manager("锦鲤");Manager zongjian=new Manager("纵剪");Manager zongjingli=new Manager("宗经理");Request request=new Request();//小菜请求加薪1000request.setRequestType("加薪");request.setRequestContent("小菜请求加薪");request.setNumber(1000);jinli.GetResult("经理", request);zongjian.GetResult("总监", request);zongjingli.GetResult("总经理", request);System.out.println("=======");Request request2=new Request();//小菜请假3天request2.setRequestType("请假");request2.setRequestContent("小菜请假");request2.setNumber(3);jinli.GetResult("经理", request2);zongjian.GetResult("总监", request2);zongjingli.GetResult("总经理", request2);}
}

出现问题:Manager类的GetResult方法比较长,且有太多的分支判断,这是不好的设计,因为可能还会增加其他的管理美别,比如项目经理、部门经理、人力总监、副总经理等等,那就意味着需要去更改Manager类,这个类承担了太多的责任,违背了单一职责原则,增加新的管理类别,需要修改这个类,违背了开放-封闭原则。
改进

class Request{private String requestType;//申请类别private String requestContent;//申请内容private int number;//数量public String getRequestType() {return requestType;}public void setRequestType(String requestType) {this.requestType = requestType;}public String getRequestContent() {return requestContent;}public void setRequestContent(String requestContent) {this.requestContent = requestContent;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}}
//管理者类
abstract class Manager{protected String name;//管理者的上级protected Manager superior;public Manager(String name) {this.name=name;}//设置管理者的上级public void SetSuperrior(Manager superior) {this.superior=superior;}abstract public void RequestApplications(Request request);
}
class CommonManager extends Manager{//经理类public CommonManager(String name) {super(name);}@Overridepublic void RequestApplications(Request request) {// TODO Auto-generated method stubif(request.getRequestType()=="请假"&&request.getNumber()<=2) {System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");}else {//其余的申请都需转到上级if(superior!=null) {superior.RequestApplications(request);}}}
}
class Majordomo extends Manager{//总监类public Majordomo(String name) {super(name);}@Override
public void RequestApplications(Request request) {// TODO Auto-generated method stubif(request.getRequestType()=="请假"&&request.getNumber()<=5) {System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");}else {if(superior!=null) {superior.RequestApplications(request);}}
}
}
class GeneralManager extends Manager{public GeneralManager(String name) {super(name);}@Overridepublic void RequestApplications(Request request) {// TODO Auto-generated method stubif(request.getRequestType()=="请假") {System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");}else if(request.getRequestType()=="加薪"&&request.getNumber()<=500) {System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");}else {System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"再说吧");}}
}
public  class Main{public static void main(String[] args){CommonManager jinli=new CommonManager("锦鲤");Majordomo zongjian=new Majordomo("纵剪");GeneralManager zhongjingli=new GeneralManager("宗经理");jinli.SetSuperrior(zongjian);zongjian.SetSuperrior(zhongjingli);Request request=new Request();request.setRequestType("请假");request.setRequestContent("小菜请假");request.setNumber(1);jinli.RequestApplications(request);Request request2=new Request();request2.setRequestType("请假");request2.setRequestContent("小菜请假");request2.setNumber(4);jinli.RequestApplications(request2);Request request3=new Request();request3.setRequestType("加薪");request3.setRequestContent("小菜加薪");request3.setNumber(1000);jinli.RequestApplications(request3);}
}

设计模式——职责链模式相关推荐

  1. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  2. 第二十章 Caché 设计模式 职责链模式

    文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...

  3. C++设计模式-职责链模式

    目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...

  4. JAVA 设计模式 职责链模式

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

  5. PHP设计模式——职责链模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对 ...

  6. 设计模式|职责链模式--流程状态审批(枚举实现)

    流程审批 在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因 ...

  7. C++设计模式——职责链模式(responsibility chain pattern)

    一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...

  8. 设计模式---职责链模式(Chain of Responsibility Pattern)

    目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...

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

    1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止.    相信大家都写过if...else或者swit ...

  10. 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理

    文章目录 案例:企业信息处理 职责链模式 总结 完整代码与文档 案例:企业信息处理 对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历.其他公司的商务合作信息.又或者是和一些企业或客 ...

最新文章

  1. linux严谨的telnet搭建并用防火墙开通与禁行
  2. 深入浅出Spring Security(一):三句话解释框架原理
  3. Elasticsearch: 权威指南 » 聚合 » Doc Values and Fielddata » 聚合与分析
  4. 使用Visual Studio实现WinForm多语言版本实例
  5. asp页面怎么转html页面,将asp页面转换成html页面 代码
  6. Spring IoC 源码系列(四)bean创建流程与循环依赖问题分析
  7. boost::mpl::abs相关的测试程序
  8. 信息学奥赛一本通C++语言——1120:同行列对角线的格
  9. 计算机如何退出1.1.2模式,华为fastboot模式怎么进入和退出?
  10. x264 scan8存储分析
  11. 如何看CentOS系统是32位还是64位的?
  12. 数据结构与算法 | 来来来,让我们重新认识一下什么是树
  13. Eclipse/MyEclipse注释模板和格式化模板的使用
  14. 【操作系统】死锁-思维导图
  15. 俄罗斯方块代码 java_俄罗斯方块java代码-java编写俄罗斯方块代码详解分享
  16. 超越网络的JavaScript
  17. 程序员工作中的一些建议
  18. 百练_1004:财务管理
  19. Kubernetes学习之路(一)之概念和架构解析和证书创建和分发
  20. Pre-Upgrade Utility---下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1)

热门文章

  1. 计算机 服务未能登陆,w7电脑开机提示Group Policy Client服务未能登陆的修复方法...
  2. centos7 Linux无法登录,找回root密码
  3. 看pdf的软件有哪些?这几款了解一下
  4. Smoothing Images
  5. MyBatis之VFS
  6. Eclipse打包出现错误:XXX is not translated in af (Afrikaans), am (Amharic), ar (Arabic).....
  7. 电赛元器件清单多年总结及分析
  8. 低功耗之产品功耗计算
  9. Oracle11g下载安装及汉化破解简单易学
  10. Java | 字段(Field)