设计模式--职责链模式(Chain of Responsibility Pattern)

news/2024/5/19 14:24:41 标签: 设计模式, 责任链模式, java

职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它为请求创建了一个接收者对象的链。
这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在职责链模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象无法处理请求,那么它会把相同的请求传给下一个接收者,依此类推。

职责链模式主要包含以下角色:

  1. 抽象处理者(Handler):定义了一个处理请求的接口,通常包含一个指向下一个处理者的引用。
  2. 具体处理者(Concrete Handler):具体处理者接收到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者。
  3. 客户类(Client):客户类负责将请求发送到链上,开始请求的处理。

职责链模式主要解决的问题是,请求的发送者不知道接收者是谁,也不知道请求的处理过程。请求在所有的处理者对象中传递,直到被某个处理者处理。这样实现了请求发送者和接收者之间的解耦。

以下是一个简单的职责链模式的 C++ 实现:

#include <iostream>

// 抽象处理者
class Handler {
public:
    virtual ~Handler() {}
    virtual void setNext(Handler* handler) = 0;
    virtual void handleRequest(int request) = 0;
};

// 具体处理者
class ConcreteHandler1 : public Handler {
public:
    ~ConcreteHandler1() {
        delete next;
    }
    void setNext(Handler* handler) override {
        next = handler;
    }
    void handleRequest(int request) override {
        if (request == 1) {
            std::cout << "ConcreteHandler1 handled the request." << std::endl;
        } else if (next) {
            next->handleRequest(request);
        }
    }
private:
    Handler* next = nullptr;
};

class ConcreteHandler2 : public Handler {
public:
    ~ConcreteHandler2() {
        delete next;
    }
    void setNext(Handler* handler) override {
        next = handler;
    }
    void handleRequest(int request) override {
        if (request == 2) {
            std::cout << "ConcreteHandler2 handled the request." << std::endl;
        } else if (next) {
            next->handleRequest(request);
        }
    }
private:
    Handler* next = nullptr;
};

// 客户端代码
int main() {
    Handler* handler1 = new ConcreteHandler1;
    Handler* handler2 = new ConcreteHandler2;
    handler1->setNext(handler2);
    handler1->handleRequest(1);
    handler1->handleRequest(2);
    delete handler1;
    return 0;
}

在这个例子中,ConcreteHandler1 和 ConcreteHandler2 是具体的处理者,它们都继承自抽象处理者 Handler。当接收到请求时,如果 ConcreteHandler1 能处理请求,就处理请求;否则,就将请求传递给下一个处理者 ConcreteHandler2。ConcreteHandler2 的处理逻辑与此类似。


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

相关文章

Springboot-接入WebSocket服务

1、依赖引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 2、启动类添加bean public class Application {/*** 会自动注册使用了ServerEndpoint注…

cudnn免登录下载

现在要下载cuDNN&#xff0c;点击下载的页面后都是出现要求先加入Nvidia developers才能进行下载&#xff0c;但这个注册的过程非常慢&#xff0c;常常卡在第二个步骤&#xff0c;这里根据亲身的经验介绍一个可以绕过这个注册或登陆步骤的方式直接下载cuDNN。遇到此类问题的可以…

08MARL深度强化学习——模型种类

文章目录 前言1、训练与执行的模型2、Centralised Training and Execution2.1 Example——central learning2.2 局限性 3、Decentralised Training and Execution3.1 Example——independent learning3.2局限性 4、Centralised Training with Decentralised Execution4.1 Examp…

问题:人的安全知识和技能是天生的。() #媒体#知识分享#学习方法

问题&#xff1a;人的安全知识和技能是天生的。&#xff08;) 人的安全知识和技能是天生的。() 参考答案如图所示 问题&#xff1a;&#xff08;&#xff09;是党和国家的根本所在、命脉所在&#xff0c;是全国各族人民的利益所在、幸福所在。 A.人民当家作主 B.坚持和完善…

LinkedList数据结构链表

LinkedList在Java中是一个实现了List和Deque接口的双向链表。它允许我们在列表的两端添加或删除元素&#xff0c;同时也支持在列表中间插入或移除元素。在分析LinkedList之前&#xff0c;需要理解链表这种数据结构&#xff1a; 链表&#xff1a;链表是一种动态数据结构&#x…

【c++】list 模拟

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能手撕list模拟 > 毒鸡汤&#xff1a;不为模糊…

1.2.1 相机模型—内参、外参

相机模型-内参、外参 更多内容&#xff0c;请关注&#xff1a; github&#xff1a;https://github.com/gotonote/Autopilot-Notes.git&#xff09; 针孔相机模型&#xff0c;包含四个坐标系&#xff1a;物理成像坐标系、像素坐标系、相机坐标系、世界坐标系。 相机参数包含&…

linux系统下vscode portable版本的c++/Cmake环境搭建002:使用 VSIX 安装VSCODE插件(暂记)

使用 VSIX 安装VSCODE插件 在 Visual Studio Code (VSCode) 中&#xff0c;你可以通过以下步骤离线安装插件&#xff1a; 获取插件的 VSIX 文件&#xff1a; 在一个联网环境中&#xff0c;访问 Visual Studio Code Marketplace&#xff0c;搜索并找到你想要的插件。 比如&am…