责任链模式解决多个ifelse问题

news/2024/5/19 15:19:19 标签: 责任链模式, 开发语言

责任链定义

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理该请求为止。

责任链模式中,通常有一个抽象处理者(Handler)作为基类,定义了处理请求的接口和一个指向下一个处理者的引用。每个具体处理者(Concrete Handler)都实现了处理请求的方法,并根据自己的逻辑判断是否能够处理该请求,如果能够处理,则处理请求并返回结果;如果不能处理,则将请求传递给下一个处理者。

这样,当一个请求从客户端发出时,它会依次经过责任链上的每个处理者,直到找到能够处理该请求的处理者为止。这种方式可以动态地组织和调整处理者的顺序,使得系统更加灵活和可扩展。

责任链模式的优点包括:

解耦发送者和接收者:发送者不需要知道请求的具体处理者,只需要将请求发送给第一个处理者即可。
可扩展性:可以动态地增加或修改处理者,而不影响其他处理者的逻辑。
灵活性:可以根据实际需求灵活地调整处理者的顺序和组合方式。

责任链模式适用于以下情况:

有多个对象可以处理同一个请求,但具体处理者在运行时才能确定。
需要动态地指定处理请求的对象集合。
需要在不明确接收者的情况下,将请求的发送者和接收者解耦。

需要注意的是,责任链模式可能存在请求无法被处理的情况,因此需要在设计时合理地设置默认处理者或者提供一个终止处理的机制,以避免请求无法得到处理的问题。

责任链模式处理多个if-else嵌套问题

责任链模式可以用来处理多个if-else嵌套问题,将复杂的条件判断逻辑拆分成一系列的处理者,每个处理者负责处理一部分条件。

以下是一个简单的示例,演示如何使用责任链模式来处理多个if-else嵌套问题:

首先,定义一个抽象处理者(Handler)作为基类,其中包含一个指向下一个处理者的引用和一个处理请求的方法:

class Handler {
protected:
    Handler* nextHandler;

public:
    Handler() : nextHandler(nullptr) {}

    void setNextHandler(Handler* handler) {
        nextHandler = handler;
    }

    virtual void handleRequest(int request) = 0;
};

然后,创建具体的处理者类,每个处理者类负责处理一部分条件:

class ConcreteHandler1 : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 0 && request < 10) {
            // 处理请求的逻辑
            std::cout << "ConcreteHandler1 处理请求:" << request << std::endl;
        } else if (nextHandler != nullptr) {
            // 将请求传递给下一个处理者
            nextHandler->handleRequest(request);
        }
    }
};

class ConcreteHandler2 : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 10 && request < 20) {
            // 处理请求的逻辑
            std::cout << "ConcreteHandler2 处理请求:" << request << std::endl;
        } else if (nextHandler != nullptr) {
            // 将请求传递给下一个处理者
            nextHandler->handleRequest(request);
        }
    }
};

class ConcreteHandler3 : public Handler {
public:
    void handleRequest(int request) override {
        if (request >= 20 && request < 30) {
            // 处理请求的逻辑
            std::cout << "ConcreteHandler3 处理请求:" << request << std::endl;
        } else if (nextHandler != nullptr) {
            // 将请求传递给下一个处理者
            nextHandler->handleRequest(request);
        }
    }
};

最后,创建一个责任链,并将请求传递给第一个处理者:

int main() {
    Handler* handler1 = new ConcreteHandler1();
    Handler* handler2 = new ConcreteHandler2();
    Handler* handler3 = new ConcreteHandler3();

    handler1->setNextHandler(handler2);
    handler2->setNextHandler(handler3);

    // 发送请求
    handler1->handleRequest(15);

    delete handler1;
    delete handler2;
    delete handler3;

    return 0;
}

在上面的示例中,如果请求的值为15,它会依次经过ConcreteHandler1、ConcreteHandler2和ConcreteHandler3进行处理,最终由ConcreteHandler2处理该请求。

通过使用责任链模式,我们可以将多个if-else嵌套的逻辑拆分成一系列的处理者,使代码更加清晰、可扩展和易于维护。


http://www.niftyadmin.cn/n/4945050.html

相关文章

Redis 可以用作关系数据库吗?

​让我们从问题“你如何使用Redis&#xff1f;”开始。我相信大多数人将其用作服务的缓存。但是&#xff0c;我希望你知道它不仅仅可以用于缓存。最近&#xff0c;我在一篇文章中看到一份报告&#xff0c;介绍了如何将部分数据迁移到Redis&#xff0c;并将请求首先发送到Redis。…

C++ 用st协程库解决 一个客户端同时连接多个服务端的问题 State Thread st协程库 在程序中的运用

继之前的一篇文章 业务需求是这样 程序中配置了很多个网络设备 这些设备作为server端 每隔1分钟要通过socket去和设备通信 以此来实现 设备是否在线 默认最传统的方法 一个线程中 遍历这些设备 假设有30个设备 每个设备超时时间5秒 那么 遍历一遍需要30*5 150秒 如…

fastadmin 下拉多级分类

要实现下图效果 一、先创建数据表 二、在目标的controll中引入use fast\Tree; public function _initialize() {parent::_initialize();$this->model new \app\admin\model\zxdc\Categorys;$tree Tree::instance();$tree->init(collection($this->model->order(…

内存受限环境下求大文件Top N词频

AI绘画资源包 https://pan.xunlei.com/s/VN_qC7kwpKFgKLto4KgP4Do_A1?pwd7kbv#https://yv4kfv1n3j.feishu.cn/docx/MRyxdaqz8ow5RjxyL1ucrvOYnnH在大数据时代,处理超大规模数据是算法工程师需要面对的重要问题。本文将以在内存受限环境下,求一个大文件中词频最高的Top N词为例…

qq过期文件怎么恢复?3个方法强烈推荐!

虽然现在很多人都喜欢使用微信社交&#xff0c;但在传输超大文件方面&#xff0c;QQ还是略胜一筹的。另外QQ还支持面对面快传&#xff0c;接收文件也更加方便快捷。 因此&#xff0c;仍然有很多人喜欢用QQ来传输文件。但是如果在文件过多的情况下&#xff0c;有可能会忘记下载…

基于Googlenet深度学习网络的信号调制类型识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 深度学习与卷积神经网络 4.2 数据预处理 4.3 GoogLeNet结构 4.4 分类器 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............…

【无线点对点网络时延分析和可视化】模拟无线点对点网络中的延迟以及物理层和数据链路层之间的相互作用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux下使用Ffmpeg循环推流

#前台运行 ffmpeg -stream_loop -1 -re -i "/usr/local/mp4/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://10.55.134.12/live/test#后台运行 nohup ffmpeg -stream_loop -1 -re -i "/usr/local/mp4/test.mp4" -vcodec h264 -ac…