设计模式:责任链模式(C++实现)

news/2024/5/19 13:26:36 标签: 设计模式, 责任链模式, c++

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它能够将请求从一个处理者传递到下一个处理者,直到找到能够处理请求的对象为止。责任链模式可以实现请求的解耦和动态的处理链。
下面是一个简单的C++责任链模式的示例:

#include <iostream>

// 抽象处理者类
class Handler
{
protected:
    Handler *successor;

public:
    Handler() : successor(nullptr) {}
    void setSuccessor(Handler *successor)
    {
        this->successor = successor;
    }
    virtual void handleRequest(int request) = 0;
};

// 具体处理者类A
class ConcreteHandlerA : public Handler
{
public:
    void handleRequest(int request) override
    {
        if (request >= 0 && request < 10)
        {
            std::cout << "Concrete Handler A handles the request." << std::endl;
        }
        else if (successor != nullptr)
        {
            successor->handleRequest(request);
        }
    }
};

// 具体处理者类B
class ConcreteHandlerB : public Handler
{
public:
    void handleRequest(int request) override
    {
        if (request >= 10 && request < 20)
        {
            std::cout << "Concrete Handler B handles the request." << std::endl;
        }
        else if (successor != nullptr)
        {
            successor->handleRequest(request);
        }
    }
};

// 具体处理者类C
class ConcreteHandlerC : public Handler
{
public:
    void handleRequest(int request) override
    {
        if (request >= 20 && request < 30)
        {
            std::cout << "Concrete Handler C handles the request." << std::endl;
        }
        else if (successor != nullptr)
        {
            successor->handleRequest(request);
        }
    }
};

int main()
{
    Handler *handlerA = new ConcreteHandlerA();
    Handler *handlerB = new ConcreteHandlerB();
    Handler *handlerC = new ConcreteHandlerC();
    handlerA->setSuccessor(handlerB);
    handlerB->setSuccessor(handlerC);
    handlerA->handleRequest(15);
    handlerA->handleRequest(20);
    handlerA->handleRequest(5);
    delete handlerA;
    delete handlerB;
    delete handlerC;
    return 0;
}

运行结果:

Concrete Handler B handles the request.
Concrete Handler C handles the request.
Concrete Handler A handles the request.

在上述示例中,Handler是抽象处理者类,定义了处理请求的接口和设置后继处理者的方法。ConcreteHandlerA、ConcreteHandlerB和ConcreteHandlerC是具体处理者类,实现了处理请求的具体逻辑。
在handleRequest()方法中,每个具体处理者首先检查自己是否能够处理请求,如果可以处理则进行相应的处理;如果不能处理,则将请求传递给下一个处理者(successor),直到找到能够处理请求的处理者为止。
在main()函数中,创建了三个具体处理者对象handlerA、handlerB和handlerC,并通过调用setSuccessor()方法将它们连接成责任链。然后通过调用handleRequest()方法来发送请求,责任链会按照设置的顺序依次处理请求,直到找到能够处理请求的处理者为止。
责任链模式可以实现请求的解耦和动态的处理链。每个处理者只需要关注自己能够处理的请求,而不需要了解整个处理流程。责任链模式还可以灵活地增加、删除或修改处理者,使系统更加灵活和可扩展。


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

相关文章

Java中this关键字的常见用法

一、this 使用方法 总结下来就是&#xff0c;在Java中&#xff0c;this是一个关键字&#xff0c;用于引用当前对象的引用&#xff0c;可以用于引用对象的实例变量和方法。主要用于以下几个方面&#xff1a; 1、在构造函数中使用this关键字来调用同一个类中的其他构造函数。这种…

Python经典练习题(三)

文章目录 &#x1f340;第一题&#x1f340;第二题&#x1f340;第三题 &#x1f340;第一题 输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 本题需要我们掌握的知识点在于&#xff0c;判断字符串&#xff0c;是数字还是字母还是啥的&#…

上传文件报错:The temporary upload location [/tmp/tomcat/xxx] is not valid

1.上传附加时报错找不到临时目录 Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat/work/Tomcat/localhost/ROOT] is not valid 发生改报错原因为 (1)、SpringBoot项目启动后&#xff0c;系…

1793_树莓派杂志第一期MagPi01阅读

全部学习汇总&#xff1a; GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. (github.com) 给自己的产品起一个好听的名称&#xff0c;我觉得这个是国外的企业中很好的一种文化。这里提到的苹果、黑莓等全都是一系列的水果。树莓派也有这样的风格&…

数据结构-----堆(完全二叉树)

目录 前言 一.堆 1.堆的概念 2.堆的存储方式 二.堆的操作方法 1.堆的结构体表示 2.数字交换接口函数 3.向上调整&#xff08;难点&#xff09; 4.向下调整&#xff08;难点&#xff09; 5.创建堆 6.堆的插入 7.判断空 8.堆的删除 9.获取堆的根(顶)元素 10.堆的遍历…

SIEM:网络攻击检测

如果您正在寻找一种能够检测环境中的网络威胁、发送实时警报并自动执行事件响应的网络攻击检测平台&#xff0c;Log360 SIEM解决方案可以完成所有这些以及更多&#xff0c;能够准确检测安全威胁并遏制网络攻击。 网络攻击检测能力 基于规则的攻击检测MITRE ATT&CK 实现来…

C语言:数组(超级详细讲解)

目录 1. 一维数组的创建和初始化 1.1数组的创建 1.2数组的初始化 2. 一维数组的使用 3. 一维数组在内存中的存储 4. 二维数组的创建和初始化 5. 二维数组的使用 6. 二维数组在内存中的存储 7. 数组越界 8. 数组作为函数参数 1. 一维数组的创建和初始化 1.1数组的创…

RAM and ROM 介绍

RAM and ROM RAM 随机存取存储器&#xff08;Random Access Memory&#xff09; 也叫主存&#xff0c;可以与CPU直接交换数据的存储器&#xff0c;它可以随时读写&#xff0c;速度快。 通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一…