设计模式之责任链模式

简介: 责任链模式很容易理解,比如说古代的时候,前方战线的信息的传递,首先是前线将军将战况交给通信兵,接下来通信兵不能为当前的状况作出指令,于是乎跑到了京城把信息交给了大臣,大臣也不能做决定,于是又把信息交给了皇帝。最终皇帝处理当前的战况信息。这就是责任链模式。整个的处理过程就像是一条链一样。

一、认识责任链模式


1、概念:

将多个对象通过引用连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。对于客户来说并不知道请求在哪一个环节被处理了。从而实现了请求和处理之间的解耦合。

这条链其实有很多种,比如说就是一条直直的链,或者是一条环形链,再或者是一颗树。


2、类图


我们通过上面的例子来看一下类图

v2-6a6c09c145dc5819375ca9a68ccc5890_1440w.jpg

从上图可以看到里面一共涉及到了三个角色:


(1)Handler:抽象处理者。它规范了每一个具体处理者的信息。

(2)ConcreteHandler:具体处理者。可以自己处理,也可以交给自己的下家处理。

(3)Client:客户端。向处理者提交请求对象。

下面我们就代码实现一下:


二、代码实现责任链模式


第一步:抽象处理者

public abstract class Handler {
    protected Handler successor;
    public abstract void handler(String  msg);
    public abstract void setSuccessor(Handler successor);
    public abstract Handler getSuccessor();
}

第二步:指定具体处理者

首先是士兵:

public class Soilder extends Handler{
    //指定消息处理继承人
    private Handler successor;
    @Override
    public void handler(String msg) {
        System.out.println("士兵没有权利处理,交给上司");
        this.successor.handler(msg);
    }
    @Override
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    @Override
    public Handler getSuccessor() {
        return successor;
    }
}

然后是大臣

public class Minister extends Handler{
    //指定消息处理继承人
    private Handler successor;
    @Override
    public void handler(String msg) {
        System.out.println("大臣也没有权利处理,交给皇帝");
        this.successor.handler(msg);
    }
    @Override
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    @Override
    public Handler getSuccessor() {
        return successor;
    }
}

最后是皇帝:

public class Emperor extends Handler{
    //指定消息处理继承人
    private Handler successor;
    @Override
    public void handler(String msg) {
        System.out.println("皇帝直接处理了");
        //注意在这里就不在指派其他人了
    }
    @Override
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    @Override
    public Handler getSuccessor() {
        return successor;
    }
}

这里我们可以发现,我们可以为每一个具体实现者设置下一任继承者,当然到达食物链最顶尖的那个可以不设置。

第三步:客户端调用

public class Client {
    public static void main(String[] args) {
        //这里的client就相当于前线将军
        String msg = "前线战况紧急,请求支援";
        Soilder soilder=new Soilder();
        Minister minister = new Minister();
        Emperor emperor = new Emperor();
        //为每一级别指定继承者
        soilder.setSuccessor(minister);
        minister.setSuccessor(emperor);
        //第一级别执行
        soilder.handler(msg);
    }
}
//输出
//士兵没有权利处理,交给上司
//大臣也没有权利处理,交给皇帝
//皇帝直接处理了

我们在这里指定了士兵的下一任处理者是大臣,大臣的下一任处理者是皇帝,没有为皇帝指派下一任处理者,输出来的结果就是这样。不过还有一种情况,也就是五百里加急的情报,士兵可以直接上报给皇帝处理,不经过大臣。这种方式也是可以的。


三、分析责任链模式


优点


1)降低耦合度:客户端不知道请求由哪个处理者处理,而处理者也可以指派任意的继承者去处理。

2)良好的扩展性:我们可以很方便的增加处理者


缺点


1)责任链比较长的时候会影响系统性能。因为中间的处理者可能太多了,就好比贪官把国家拨得钱一层一层搜刮,到最后就剩下一点点了。

2)当出现错误的时候,我们必须按照这个链一层一层去解决处理。

这个责任链模式在实际当中有什么应用呢?最典型的就是Tomcat中的Filter,当然异常处理的设计一般也会用到责任链模式。

OK,责任链模式就是这样。如有问题还请批评指正。

相关文章
|
7月前
|
设计模式 Java
【设计模式系列笔记】责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它。每个处理者都有一个对下一个处理者的引用。责任链模式常用于处理请求的场景,例如在一个请求需要经过多个步骤或者多个对象来处理的情况下。
81 0
|
7月前
|
设计模式 Java
【设计模式】责任链模式
【设计模式】责任链模式
|
7月前
|
设计模式
【设计模式】责任链模式
【1月更文挑战第27天】【设计模式】责任链模式
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
55 9
|
23天前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
36 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
15 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
38 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
43 0
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
2月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
27 0