1、例子
学校
OA
系统的采购审批项目:需求是
1)
采购员采购教学器材
2)
如果金额 小于等于
5000,
由教学主任审批 (
0<=x<=5000
)
3)
如果金额 小于等于
10000,
由院长审批
(5000<x<=10000)
4)
如果金额 小于等于
30000,
由副校长审批
(10000<x<=30000)
5)
如果金额 超过
30000
以上,有校长审批
( 30000<x)
请设计程序完成采购审批项目
传统方案
![](https://i-blog.csdnimg.cn/blog_migrate/b16d8451bb6022ae30409e3b06703243.png)
分析
1)
传统方式是:接收到一个采购请求后,根据采购金额来调用对应的
Approver (
审批
人
)
完成审批。
2)
传统方式的问题分析
:
客户端这里会使用到 分支判断
(
比如
switch)
来对不同的采
购请求处理, 这样就存在如下问题
(1)
如果各个级别的人员审批金额发生变化,在
客户端的也需要变化
(2)
客户端必须明确的知道 有多少个审批级别和访问
3)
这样 对一个采购请求进行处理 和
Approver (
审批人
)
就存在强耦合关系,不利于代
码的扩展和维护
4)
解决方案
=
》 职责链模式
2、基本定义
1)
职责链模式(
Chain of Responsibility Pattern
)
,
又叫 责任链模式,为请求创建了一个
接收者
对象的链
(
简单示意图
)
。这种模式对请求的
发送者和接收者进行解耦。
2)
职责链模式通常每个接收者都包含对另一个接
收者的引用。如果一个对象不能处理该请求,
那么它会把相同的请求传给下一个接收者,依
此类推。
3)
这种类型的设计模式属于行为型模式
![](https://i-blog.csdnimg.cn/blog_migrate/6f064ac62588de0817db0049c07697a9.png)
1) Handler : 抽象的处理者, 定义了一个处理请求的接口, 同时含义另外Handler
2) ConcreteHandlerA , B 是具体的处理者, 处理它自己负责的请求, 可以访问它的后继者(即下一个处
理者), 如果可以处理当前请求,则处理,否则就将该请求交个 后继者去处理,从而形成一个职责链
3) Request , 含义很多属性,表示一个请求
总结:if判断的做成接口,传入和处理 用接口解耦
3、代码