23.1 场景问题
23.1.1 申请聚餐费用
来考虑这样一个功能:申请聚餐费用的管理。
很多公司都有这样的福利,就是项目组或者是部门可以向公司申请一些聚餐费用,用于组织项目组成员或者是部门成员进行聚餐活动,以增进人员之间的情感,更有利于工作中的相互合作。
申请聚餐费用的大致流程一般是:由申请人先填写申请单,然后交给领导审查,如果申请批准下来了,领导会通知申请人审批通过,然后申请人去财务核领费用,如果没有核准,领导会通知申请人审批未通过,此事也就此作罢了。
不同级别的领导,对于审批的额度是不一样的,比如:项目经理只能审批500元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。
也就是说,当某人提出聚餐费用申请的请求后,该请求会由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求,但是申请人并不知道应该由总经理来处理他的申请请求。
那么该怎样实现这样的功能呢?
23.1.2 不用模式的解决方案
分析上面要实现的功能,主要就是要根据申请费用的多少,然后让不同的领导来进行处理就可以实现了。也就是有点逻辑判断而已,示例代码如下:
/** * 处理聚餐费用申请的对象 */ public class FeeRequest { /** * 提交聚餐费用申请给项目经理 * @param user 申请人 * @param fee 申请费用 * @return 成功或失败的具体通知 */ 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 ret="+ret1); String ret2 = request.requestToProjectManager("小张", 300); System.out.println("the ret="+ret2);
String ret3 = request.requestToProjectManager("小李", 600); System.out.println("the ret="+ret3); String ret4 = request.requestToProjectManager("小张", 600); System.out.println("the ret="+ret4);
String ret5 = request.requestToProjectManager("小李", 1200); System.out.println("the ret="+ret5); String ret6 = request.requestToProjectManager("小张", 1200); System.out.println("the ret="+ret6); } } |
运行结果如下:
the ret1=项目经理同意小李聚餐费用300.0元的请求 the ret2=项目经理不同意小张聚餐费用300.0元的请求 the ret3=部门经理同意小李聚餐费用600.0元的请求 the ret4=部门经理不同意小张聚餐费用600.0元的请求 the ret5=总经理同意小李聚餐费用1200.0元的请求 the ret6=总经理不同意小张聚餐费用1200.0元的请求 |
23.1.3 有何问题
上面的实现很简单,基本上没有什么特别的难度。仔细想想,这么实现有没有问题呢?仔细分析申请聚餐费用的业务功能和目前的实现,主要面临着如下问题:
- 聚餐费用申请的处理流程是可能会变动的。
比如现在的处理流程是:提交申请给项目经理,看看是否适合由项目经理处理,如果不是à看看是否适合由部门经理处理,如果不是à总经理处理的步骤。今后可能会变化成:直接提交给部门经理,看看是否适合由部门经理处理,如果不是à总经理处理这样的步骤。也就是说,对于聚餐费用申请,要求处理的逻辑步骤是灵活的。 - 各个处理环节的业务处理也是会变动的。
因为处理流程可能发生变化,也会导致某些步骤的具体的业务功能发生变化,比如:原本部门经理审批聚餐费用的时候,只是判断是否批准;现在,部门经理可能在审批聚餐费用的时候,核算本部门的实时成本,这就出现新的业务处理功能了。
如果采用上面的实现,要是处理的逻辑发生了变化,解决的方法,一个是生成一个子类,覆盖requestToProjectManager方法,然后在里面实现新的处理;另外一个方法就是修改处理申请的方法的源代码来实现。要是具体处理环节的业务处理的功能发生了变化,那就只好找到相应的处理方法,进行源代码修改了。
总之都不是什么好方法,也就是说,如果出现聚餐费用申请的处理流程变化的情况,或者是出现各个处理环节的功能变化的时候,上面的实现方式是很难灵活的变化来适应新功能的要求的。
把上面的问题抽象一下:客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的。对于客户端而言,无所谓谁来处理,反正有对象处理就可以了。
而且在上述处理中,还希望处理流程是可以灵活变动的,而处理请求的对象需要能方便的修改或者是被替换掉,以适应新的业务功能的需要。
请问如何才能实现上述要求?
相关推荐
1.职责链模式它把请求与处理函数进行解耦,这一点符合开放封闭原则,请求在链条中 2.职责链模式可以由调用者决定从哪个链条开始处理请求,并不一定要从第一个链条开
第4章 职责链模式提出问题问题描述:假设提交请求的对象并不明确知道谁是最终响应请求的对象,当产生一个请求时,应该如何寻找恰当的处理对象?如果对每个请求都制定一个
职责链模式 设计模式 Chain of Responsibility 若有问题望指出。
C# 职责链模式 代码 模型代码,学习。
设计模式之职责链模式的代码详解,简单明了的将模式思想以代码编写出来,常用的设计模式
定义使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。UML应用场
设计模式之职责链模式,这份文档以例子的形式讲诉了设计模式之职责链模式,希望可以帮助需要的人!
职责链模式的示例代码和文档,学习职责链模式的参考资料。
参考<大话设计模式>,采用python书写的模板类。职责链模式。
职责链模式.cpp职责链模式的实现
C++ 职责链 设计模式
Java 23种设计模式17职责链模式.pdf
类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。 对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式...
为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
职责链模式 内附带PPT和源码 公司内部技术分享
设计模式-职责链模式(讲解及其实现代码)
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 职责链模式的一个...
17 第17章 职责链模式17 第17章 职责链模式17 第17章 职责链模式
C#面向对象设计模式纵横谈(20):(行为型模式) Chain Of Responsibility 职责链模式