责任链模式(行为型)

目录

一、前言

二、责任链模式

三、总结


一、前言

责任链模式(Chain of Responsibility Pattern)也叫职责链模式,是一种行为型设计模式,职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链。并沿着这条链传递该请求,直到有一个对象处理它为止。

责任链模式由以下角色组成:

Handler(抽象处理者):

定义一个处理请求的接口,包含处理请求的方法,还包含一个指向下一个处理者的引用(即链中的下一个处理者)

Concrete Handler(具体处理者):

继承或实现抽象处理者接口,具体处理请求的逻辑在这里实现,如果不能处理当前请求,则将请求传递给下一个处理者

Client(客户端):

负责创建并组装职责链,将请求发送给链中的第一个处理者

整个责任链模式的结构图:

二、责任链模式

比如一些请求制度,我们可以设置组长能够审批3天因为的假期,经理可以审批10天以内的假期,CEO可以审批30天以内的假期,不允许超过30天,这种时候就可以使用责任链模式进行演示。

首先创建Handler类:

java 复制代码
public abstract class Handler {

    public Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(int request);
}

接着创建具体的实现类:

java 复制代码
public class ConcreteHandlerOne extends Handler{

    @Override
    public void handleRequest(int request) {
        if(request >= 0 && request < 3){
            System.out.println(String.format("组长同意请假:%s天", request));
        }else if(successor != null){
            successor.handleRequest(request);
        }
    }
}

public class ConcreteHandlerTwo extends Handler{
    @Override
    public void handleRequest(int request) {
        if(request >= 3 && request < 10){
            System.out.println(String.format("经理同意请假:%s天", request));
        }else if(successor != null){
            successor.handleRequest(request);
        }
    }
}

public class ConcreteHandlerThree extends Handler{
    @Override
    public void handleRequest(int request) {
        if(request >= 10 && request <= 30){
            System.out.println(String.format("CEO同意请假:%s天", request));
        }else {
            System.out.println("请假天数不符合要求");;
        }
    }
}

最后是客户端Client类:

java 复制代码
public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandlerOne();
        Handler handler2 = new ConcreteHandlerTwo();
        Handler handler3 = new ConcreteHandlerThree();

        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handler3);

        handler1.handleRequest(1);
        handler1.handleRequest(4);
        handler1.handleRequest(15);
        handler1.handleRequest(40);
    }
}

运行结果:

三、总结

优点与缺点:

优点:

降低耦合度:

请求的发送者和接收者解耦,发送者无需知道具体的接收者是谁,也无需了解处理链的结构

增加灵活性:

可以在运行时动态地添加或修改处理者,从而灵活地改变职责链

职责分担:

每个处理者只需关注自己能处理的任务,职责单一明确

增强扩展性:

增加新的具体处理者非常方便,不影响已有的系统

缺点:

可能导致请求未被处理:

如果链条上的所有处理者都不能处理请求,可能导致请求未被处理,除非在链的末端有个默认处理者

调试复杂:

由于请求是在链条上进行传递,调试起来较为困难,尤其是在链条较长或处理逻辑复杂时

性能问题:

如果链条很长,可能会影响系统性能,尤其是在每个处理者都需要进行复杂判断时

应用场景:

请求的处理需要多个对象中的一个或多个进行处理:

如多个审批人依次审批请求的场景,每个审批人根据自己的权限或条件决定是否审批或将请求传递给下一个审批人

动态指定请求的处理者:

如在一个系统中,根据不同的请求类型动态选择不同的处理者

需要在处理者之间进行职责分离:

如在责任明确的系统中,每个模块各司其职,如日志记录、权限校验、数据处理等

例如时间处理系统、审批工作流、请求过滤器

相关推荐
博风27 分钟前
设计模式:6、装饰模式(包装器)
设计模式
A_cot28 分钟前
理解设计模式与 UML 类图:构建稳健软件架构的基石
microsoft·设计模式·简单工厂模式·工厂方法模式·uml
君败红颜30 分钟前
设计模式之创建模式篇
设计模式
闲人一枚(学习中)4 小时前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
小白不太白9506 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白9507 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in7 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in7 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
闲人一枚(学习中)8 小时前
设计模式-创建型-原型模式
设计模式
Iced_Sheep8 小时前
干掉 if else 之策略模式
后端·设计模式