责任链模式

目录

 

0.背景描述

1.责任链模式介绍

1.1责任链模式的定义

1.2责任链模式UML结构图

2.责任链模式的Java实现

2.1用例UML结构图

2.2用例代码

3.责任链模式总结

4.结语


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.结语

我自己在具体的开发中,用到责任链模式的场景比较少,所以理解没有很透彻,用例也可能不是特别恰当,读者理解就好

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值