目录
0.背景描述
最近流感盛行,小李也不幸中招,感冒发烧流鼻涕,头晕眼花心烦闷,实在无法专心工作,于是提了一个请假申请麻溜去医院看病了,两天之后就活蹦乱跳的回来继续工作了。
如果在软件设计中,我们用程序来实现请假的这么一个操作应该怎么办,比如提出请假申请之后需要上级领导->总监->hr主管一一审批,总的设计应该大致是这样的,上级领导接收到请假的申请,自己处理,审批驳回直接终止,审批通过就将申请提交给下一级的审批人,依此类推。在设计模式中,责任链模式能够很好的满足这一设计需求,在责任链模式里面,很多对象 将自己以及自己对下一级对象的引用连接起来形成一条链,请求在这条链上依次传递知道被最终处理为止。
1.责任链模式介绍
1.1责任链模式的定义
责任链模式:责任链模式将所有需要处理请求的对象形成一条链,可以依次的来处理请求,直达这条链终止为止。
1.2责任链模式UML结构图
Client:客户端类,关联了抽象处理者,用于发出请求。
Handler:抽象处理者,定义了处理者的公共处理方法(handlerRequest()),持有对下一级处理者的引用。
ConcreteHandler:具体处理者,继承了抽象处理者Handler,具体处理者在接收到请求之后可以自己处理,或者由自己持有的下一级处理者来处理。
2.责任链模式的Java实现
本节以请假申请为例,以Java实现简单的责任链模式(JDK版本为10)
2.1用例UML结构图
Client:客户端类,关联了抽象处理者,用于发出请求。
AbstractHandler:抽象处理者,定义了处理者的公共处理方法(handlerRequest()),持有对下一级处理者的引用。
LeaderHandler:直属上级处理者。
ZongJianHandler:总监处理者。
HrHandler:hr处理者。
2.2用例代码
Client:
public class Client {
public static void main(String[] args) {
AbstractHandler leaderHandler = new LeaderHandler();
AbstractHandler zongJianHandler = new ZongJianHandler();
AbstractHandler hrHandler = new HrHandler();
leaderHandler.setSuccessor(zongJianHandler);
zongJianHandler.setSuccessor(hrHandler);
System.out.println("生病了,需要请假");
leaderHandler.handlerRequest();
}
}
AbstractHandler:
public abstract class AbstractHandler {
/**
* 下一级处理者
*/
protected AbstractHandler successor;
/**
* 抽象处理方法
*/
abstract void handlerRequest();
public AbstractHandler getSuccessor() {
return successor;
}
public void setSuccessor(AbstractHandler successor) {
this.successor = successor;
}
}
LeaderHandler:
public class LeaderHandler extends AbstractHandler {
@Override
void handlerRequest() {
System.out.println("直属上级:审批通过");
if(this.getSuccessor()!=null){
this.getSuccessor().handlerRequest();
}
}
}
ZongJianHandler:
public class ZongJianHandler extends AbstractHandler {
@Override
void handlerRequest() {
System.out.println("总监:审批通过");
if (this.getSuccessor() != null) {
this.getSuccessor().handlerRequest();
}
}
}
HrHandler:
public class HrHandler extends AbstractHandler {
@Override
void handlerRequest() {
System.out.println("hr:审批通过");
if (this.getSuccessor() != null) {
this.getSuccessor().handlerRequest();
}
}
}
运行结果如下:
以上是Java版的责任链模式的简单实现,在三级审批者中,自己处理完之后一次提交给了下一级处理者,当然,即便存在下一级处理者,也可以自己直接处理(驳回),比如直属领导认为小李的病是装的,他想找借口去面试了,可以直接处理不必提交给下一级处理者。
3.责任链模式总结
优点:将请求的发送者与请求的接收者解耦,客户端不知道请求最终的处理者是哪一级,使得系统可以在不影响客户端的情况下动态的修改处理者
缺点:请求在整体责任链上面流转可能最终不会被处理,比如请假申请中,没人处理请假申请。
4.结语
我自己在具体的开发中,用到责任链模式的场景比较少,所以理解没有很透彻,用例也可能不是特别恰当,读者理解就好