(三)行为模式:1、责任链模式(Chain of Responsibility Pattern)(C++示例)

news/2024/5/19 16:14:48 标签: 责任链模式, 设计模式, c++

目录

1、责任链模式(Chain of Responsibility Pattern)含义

2、责任链模式的UML图学习

3、责任链模式的应用场景

4、责任链模式的优缺点

5、C++实现责任链模式的实例


1、责任链模式(Chain of Responsibility Pattern)含义

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

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者和接收者解耦,使多个对象都有机会处理该请求。

每个接收者都包含对下一个接收者的引用,形成一个链条,当一个请求在链条上传递时,直到有一个接收者能够处理它为止。

2、责任链模式的UML图学习

责任链模式主要包含以下几个角色:

(1)抽象处理者(Handler):定义了处理请求的接口,并持有下一个处理者的引用。

(2)具体处理者(Concrete Handler):实现了抽象处理者的接口,具体处理请求的逻辑。如果自己无法处理请求,则将请求传递给下一个处理者。

3、责任链模式的应用场景

(1)有多个对象可以处理同一个请求,但具体处理者在运行时才能确定。

(2)需要动态地指定处理请求的顺序。

(3)发送者和接收者之间的关系应该被解耦。

4、责任链模式的优缺点

(1)优点:

        1)解耦发送者和接收者:请求发送者不需要知道具体的接收者,只需要将请求发送给第一个处理者即可,由处理者之间的关系来决定谁来处理请求。

        2)可扩展性:可以动态地增加或修改处理者,灵活地调整责任链的结构。

        3)可配置性:可以通过配置文件或其他方式来确定责任链的顺序和组成。

(2)缺点:

        1)请求可能无法被处理:如果没有合适的处理者来处理请求,请求可能会被忽略或丢失。

        2)性能影响:由于请求需要在责任链上传递,可能会影响系统的性能。

5、C++实现责任链模式的实例


#include <iostream>

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

// 具体处理者A
class ConcreteHandlerA : public Handler 
{
private:
    Handler* nextHandler;

public:
    void setNext(Handler* handler) override 
    {
        nextHandler = handler;
    }

    void handleRequest(int request) override 
    {
        if (request >= 0 && request < 10) 
        {
            std::cout << "ConcreteHandlerA 处理请求:" << request << std::endl;
        }
        else if (nextHandler != nullptr) 
        {
            nextHandler->handleRequest(request);
        }
    }
};

// 具体处理者B
class ConcreteHandlerB : public Handler 
{
private:
    Handler* nextHandler;

public:
    void setNext(Handler* handler) override 
    {
        nextHandler = handler;
    }

    void handleRequest(int request) override 
    {
        if (request >= 10 && request < 20) 
        {
            std::cout << "ConcreteHandlerB 处理请求:" << request << std::endl;
        } 
        else if (nextHandler != nullptr) 
        {
            nextHandler->handleRequest(request);
        }
    }
};

// 具体处理者C
class ConcreteHandlerC : public Handler 
{
private:
    Handler* nextHandler;

public:
    void setNext(Handler* handler) override 
    {
        nextHandler = handler;
    }

    void handleRequest(int request) override 
    {
        if (request >= 20 && request < 30) 
        {
            std::cout << "ConcreteHandlerC 处理请求:" << request << std::endl;
        } 
        else if (nextHandler != nullptr) 
        {
            nextHandler->handleRequest(request);
        }
    }
};

int main() 
{
    // 创建具体处理者对象
    ConcreteHandlerA handlerA;
    ConcreteHandlerB handlerB;
    ConcreteHandlerC handlerC;

    // 设置责任链的顺序
    handlerA.setNext(&handlerB);
    handlerB.setNext(&handlerC);

    // 发送请求
    handlerA.handleRequest(5);
    handlerA.handleRequest(15);
    handlerA.handleRequest(25);

    return 0;
}

在上述示例中,抽象处理者(Handler)定义了处理请求的接口和设置下一个处理者的方法。具体处理者(ConcreteHandler)继承自抽象处理者,并实现了处理请求的逻辑。每个具体处理者都持有下一个处理者的引用,在处理请求时,如果满足条件,则处理请求;否则将请求传递给下一个处理者。


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

相关文章

cesium添加倾斜摄影

1.107 版本之前 //倾斜摄影const tileset new Cesium.Cesium3DTileset({url: "http://你的地址/tileset.json",});viewer.scene.primitives.add(tileset);tileset.readyPromise.then(function (tileset) {viewer.zoomTo(tileset);})在2023年7月的版本更新中上述写法…

FPGA_学习_16_IP核_ROM

在寻找APD最合适的偏压的过程中&#xff0c;一般会用到厂商提供一条曲线&#xff0c;横坐标是温度的变化&#xff0c;纵坐标表示击穿偏压的变化&#xff0c;但每个产品真正的击穿偏压是有差异的。 为了能够快速的找到当前温度下真实的击穿偏压&#xff0c;我们可以这样做&#…

在PB中控制数据窗口列的修改属性

在编制管理信息应用系统中,一般都会遇到一个共同问题,那就是如何根据不同情况去控制表中的数据列,比如对于同一DATAWINDOW不同的用户有不同的操作(如对于数据录入人员可以更改数据,而对于查询人员一般不能更改数据),下面就以一个简单的工资表为例来说明利用PB如何在DATA…

如何遍历HashMap集合?

在Java中&#xff0c;HashMap是一种常用的数据结构&#xff0c;它提供了快速的查找、插入和删除操作。当我们需要遍历HashMap中的所有元素时&#xff0c;可以利用三种不同的方法实现。 方法一&#xff1a;使用键值对遍历 HashMap中存储的是键值对的形式&#xff0c;因此最简单…

mysql 数据备份和恢复

操作系统&#xff1a;22.04.1-Ubuntu mysql 版本&#xff1a;8.033 binlog 介绍 binlog 是mysql 二进制日志 binary log的简称&#xff0c;可以简单理解为数据的修改记录。 需要开启binlog,才会产生文件&#xff0c;mysql 8.0 默认开启,开启后可以在 /var/lib/mysql &#xff…

国内小厂操刀,16G显存神卡只要599,老外急眼了

这年头&#xff0c;电脑配置 DIY 见怪不怪&#xff0c;你可曾听闻显卡规格 DIY&#xff1f; 前不久国外网友整出的 16G 显存 RTX 3070、国内大佬魔改的 22G 显存 RTX 2080Ti。 这些可都是官方从未发布过的船新版本。 显存容量无伤翻倍&#xff0c;关键还能不同批次搭配组合&a…

解决方案 | 电子签优化医药企业管理流程

疫情过后&#xff0c;居民健康意识显著增强&#xff0c;国家相继出台的健康行业的鼓励政策&#xff0c;也让整个医药行业得到了稳定持续的发展。但机遇往往意味着挑战&#xff0c;医药行业在迎来巨大发展的同时&#xff0c;也面临着内外部行业合规风险的挑战&#xff1a;从行业…

搭建Web服务器并用cpolar发布至公网访问

本地电脑搭建Web服务器并用cpolar发布至公网访问 文章目录 本地电脑搭建Web服务器并用cpolar发布至公网访问前言1. 首先在电脑安装PHPStudy、WordPress、cpolar2. 安装cpolar&#xff0c;进入Web-UI界面3. 安装wordpress4. 进入wordpress网页安装程序5. 利用cpolar建立的内网穿…