设计模式——职责链模式
一、职责链模式
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);}
}
设计模式——职责链模式相关推荐
- Python设计模式-职责链模式
Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...
- 第二十章 Caché 设计模式 职责链模式
文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...
- C++设计模式-职责链模式
目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
- PHP设计模式——职责链模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对 ...
- 设计模式|职责链模式--流程状态审批(枚举实现)
流程审批 在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因 ...
- C++设计模式——职责链模式(responsibility chain pattern)
一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...
- 设计模式---职责链模式(Chain of Responsibility Pattern)
目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...
- 设计模式-职责链模式
1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止. 相信大家都写过if...else或者swit ...
- 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理
文章目录 案例:企业信息处理 职责链模式 总结 完整代码与文档 案例:企业信息处理 对于一个企业来说,每天难免的要收到大量的信息,有求职者发送过来的简历.其他公司的商务合作信息.又或者是和一些企业或客 ...
最新文章
- linux严谨的telnet搭建并用防火墙开通与禁行
- 深入浅出Spring Security(一):三句话解释框架原理
- Elasticsearch: 权威指南 » 聚合 » Doc Values and Fielddata » 聚合与分析
- 使用Visual Studio实现WinForm多语言版本实例
- asp页面怎么转html页面,将asp页面转换成html页面 代码
- Spring IoC 源码系列(四)bean创建流程与循环依赖问题分析
- boost::mpl::abs相关的测试程序
- 信息学奥赛一本通C++语言——1120:同行列对角线的格
- 计算机如何退出1.1.2模式,华为fastboot模式怎么进入和退出?
- x264 scan8存储分析
- 如何看CentOS系统是32位还是64位的?
- 数据结构与算法 | 来来来,让我们重新认识一下什么是树
- Eclipse/MyEclipse注释模板和格式化模板的使用
- 【操作系统】死锁-思维导图
- 俄罗斯方块代码 java_俄罗斯方块java代码-java编写俄罗斯方块代码详解分享
- 超越网络的JavaScript
- 程序员工作中的一些建议
- 百练_1004:财务管理
- Kubernetes学习之路(一)之概念和架构解析和证书创建和分发
- Pre-Upgrade Utility---下载并运行Oracle数据库预升级实用程序 (文档 ID 1577379.1)
热门文章
- 计算机 服务未能登陆,w7电脑开机提示Group Policy Client服务未能登陆的修复方法...
- centos7 Linux无法登录,找回root密码
- 看pdf的软件有哪些?这几款了解一下
- Smoothing Images
- MyBatis之VFS
- Eclipse打包出现错误:XXX is not translated in af (Afrikaans), am (Amharic), ar (Arabic).....
- 电赛元器件清单多年总结及分析
- 低功耗之产品功耗计算
- Oracle11g下载安装及汉化破解简单易学
- Java | 字段(Field)