通俗易懂设计模式(责任链模式)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将多个对象组成一个链式结构,并在这个链式结构中传递一个请求。每个对象都可以处理这个请求,或者将它传递给下一个对象。责任链模式的主要目的是在处理请求时实现解耦,让多个对象都有机会处理这个请求,而不是将这个请求的处理逻辑集中在一个对象中。

责任链模式的主要组成部分包括:

  1. 处理器(Handler):定义了一个接口,用于处理请求。处理器可以是一个抽象类或者一个接口。
  2. 具体处理器(ConcreteHandler):实现了处理器接口,并在其中定义了一个指向下一个处理器的引用。具体处理器可以处理请求,也可以将请求传递给下一个处理器。

责任链模式的优点:

  1. 解耦:责任链模式将请求的处理逻辑分散在多个处理器中,降低了各个处理器之间的耦合度。
  2. 灵活性:责任链模式允许在运行时动态地添加或删除处理器,从而实现了更高的灵活性。
  3. 可扩展性:责任链模式可以通过添加新的处理器来扩展系统的功能,而不需要修改已有的代码。

Java 实现责任链模式的示例代码:

java 复制代码
// 处理器接口
public abstract class Handler {
    protected Handler next;

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void handleRequest(int request);
}

// 具体处理器 A
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println("ConcreteHandlerA: handle request " + request);
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

// 具体处理器 B
public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("ConcreteHandlerB: handle request " + request);
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

// 具体处理器 C
public class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println("ConcreteHandlerC: handle request " + request);
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        handlerA.setNext(handlerB);
        handlerB.setNext(handlerC);

        handlerA.handleRequest(5);
        handlerA.handleRequest(15);
        handlerA.handleRequest(25);
    }
}

在这个示例中,我们定义了一个处理器接口 Handler,它包含了一个 handleRequest() 方法。接着,我们定义了三个具体处理器类 ConcreteHandlerAConcreteHandlerBConcreteHandlerC,它们都实现了 Handler 接口,并在其中定义了一个指向下一个处理器的引用。在具体处理器类的 handleRequest() 方法中,我们根据请求的值来判断是否需要处理这个请求,或者将请求传递给下一个处理器。

在客户端代码中,我们创建了三个具体处理器对象,并通过 setNext() 方法将它们组成一个链式结构。然后,我们通过第一个处理器对象 handlerA 来处理一些请求。通过这个链式结构,我们可以在处理请求时实现解耦,让多个对象都有机会处理这个请求,而不是将这个请求的处理逻辑集中在一个对象中。这样,我们就将请求的处理过程封装在了具体处理器类中,使得请求的处理变得更加灵活和可扩展。

相关推荐
爱读源码的大都督13 分钟前
为什么有了HTTP,还需要gPRC?
java·后端·架构
Lucky_Turtle31 分钟前
【Java Xml】Apache Commons Digester3解析
xml·java·apache
聪明的笨猪猪1 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.1 小时前
我发送给Apifox是http://localhost:9002/goods/getByUserName?name=张三 为什么会是500哪里错了?
java·服务器·网络协议·http
ID_180079054731 小时前
京东获取整站实时商品详情数据|商品标题|数据分析提取教程
java·开发语言
微露清风2 小时前
系统性学习C++-第五讲-内存管理
java·c++·学习
计算机毕业设计木哥2 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
java·vue.js·spring boot·后端·课程设计
235162 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
聪明的笨猪猪2 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.2 小时前
怎么办这是Apifox里执行http://localhost:9002/goods/getByUserName?name=“张三“为什么我改了还是500?
java·网络·网络协议·http