行为型模式之职责链
参考:
引言:
行为型模式是一类主要关注对象之间相互通信(也可以说成交互)的设计模式。
其作用要能保证对象之间能够交换数据,同时保证对象之间的松耦合。
行为型模式主要分为对象行为型模式和类行为型模式两种
定义:(Chain of Responsibility Pattern)COR
职责链模式--属于对象行为型模式,在一系列对象链之间传递请求的方法。
在职责链模式中,由发送端发送一个请求到一个对象链中,链中的对象自行处理请求,如果链中的对象决定不响应请求,它会将请求转发给链中的下一个对象。(可以理解为老师问答,学生一个一个的传递问题,如果问题被回答上,就结束,否则就会将问题传递给下一个人)。
可以将请求的发送者和请求的接收者解耦
应用示例:
Servlet过滤器和Java异常处理机制(catch机制)。
采购流程审批,采购审批一般会根据采购金额的大小,依次由不同层级的领导处理。
玩扑克,一人出牌后,每一位玩家都可以依次处理出牌人的牌,要不起就依次下一个玩家处理
UML类图:
1
类图分析:
抽象处理者:handler,定义用于处理请求的接口。
具体处理者:concreteHandler,负责真实的处理请求,如果可以处理该请求就自行处理,否则就将该请求传给下一个处理者
客户端:client,将命令发送给职责链中第一个能够处理该请求的处理者。
代码实现:
本实例代码采用企业采购流程审批作为场景。
2首先不采用COR模式去实现以上流程审批代码如下:
1:采购请求类
32:采购审批处理者类
4递交给第一个能够审批人的审批方法
5分析:
采用以上方式编写的代码是否会存在问题?
1:审批流程通过if else 的形式处理,后期如果增加/减少审批人,或者修改每一层级领导可以审批的金额上线,就需要修改审批方法,违反了开闭原则
2:PurchaseRequestApprovalHandler 类复杂,违法单一职责原则
3:审批流程固定死了,只能从主任-->副总--> 老总 --> 董事会,如果我们想要改变这个顺序,只能修改源代码,即客户端无法自定义审批流程的顺序
更好的方案:
COR责任链模式
通过以上UML类图,总结出一下实现步骤
1:抽象出处理者,处理者可以处理请求,若处理不了,就需要将请求传递给下一个处理者
2:具体处理者实现
3:责任链的创建,即流程审批的顺序链,注意一下此处职责链的创建应该交由使用该责任链的客户端创建。
基于采购审批的UML类图:
6代码实现:
采购单---请求对象
7抽象处理者
8具体处理者---主任
9副总:
10老总:
11董事会:
12客户端测试代码:
13结果:
14总结:
以上通过COR的模式进行了采购流程审批的代码实现,具有良好的灵活性
后期需要增加一种角色去审批的化,只需要继承一下抽象处理类Approver即可。
在实际的软件开发中,如果遇到有多个对象可以处理同一个请求是可以考虑使用职责链模式,比较常见的就是web开发中的过滤器Filter链,来对请求数据进行过滤(中文乱码处理),以及在工作流中实现分级审批,servlet中的拦截器等。