首页 > 其他分享 >行为模式-责任链模式

行为模式-责任链模式

时间:2023-11-10 10:34:49浏览次数:28  
标签:请求 处理 request 模式 next 责任 Handler HandleRequest 行为

1 什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,用于建立一个对象链,每个对象都有机会处理请求。请求沿着对象链传递,直到有一个对象能够处理它为止。这样,责任链模式将请求的发送者和接收者解耦,动态确定处理请求的对象。
在责任链模式中,通常有两种角色:抽象处理者(Handler)和具体处理者(Concrete Handler)。抽象处理者定义了处理请求的接口,并实现了一个指向下一个处理者的引用。具体处理者继承自抽象处理者,负责实际的处理请求逻辑,并根据需要决定是否将请求传递给下一个处理者。

2 举个例子

下面以一个审批流程为例来说明责任链模式。假设有一个请假申请的处理流程,包括三个级别的审批者:组长、经理和总经理。每个审批者可以决定是否批准申请,并将申请传递给下一个级别的审批者,直到达到最终的处理者。
首先,我们定义一个抽象处理者接口Handler,其中包含两个方法:处理请求的HandleRequest和设置下一个处理者的SetNext。

class Handler
{
public:
    virtual void HandleRequest(const Request& request) = 0;
    virtual void SetNext(Handler* next) = 0;
};

然后,我们创建具体处理者类GroupLeader、Manager和GeneralManager,分别代表组长、经理和总经理。

class GroupLeader : public Handler
{
public:
    void HandleRequest(const Request& request)
    {
        if (request.level <= 1)
        {
            std::cout << "GroupLeader handle the request." << std::endl;
        }
        else if (next_ != nullptr)
        {
            next_->HandleRequest(request);
        }
    }

    void SetNext(Handler* next)
    {
        next_ = next;
    }

private:
    Handler* next_;
};

class Manager : public Handler
{
public:
    void HandleRequest(const Request& request)
    {
        if (request.level <= 2)
        {
            std::cout << "Manager handle the request." << std::endl;
        }
        else if (next_ != nullptr)
        {
            next_->HandleRequest(request);
        }
    }

    void SetNext(Handler* next)
    {
        next_ = next;
    }

private:
    Handler* next_;
};

class GeneralManager : public Handler
{
public:
    void HandleRequest(const Request& request)
    {
        if (request.level <= 3)
        {
            std::cout << "GeneralManager handle the request." << std::endl;
        }
        else
        {
            std::cout << "No one can handle the request." << std::endl;
        }
    }

    void SetNext(Handler* next)
    {
        next_ = next;
    }

private:
    Handler* next_;
};

最后,我们可以创建一个处理者链,并将请求从第一个处理者传递到链上的每个处理者,直到找到一个能够处理请求的处理者。

int main()
{
    Handler* groupLeader = new GroupLeader();
    Handler* manager = new Manager();
    Handler* generalManager = new GeneralManager();

    groupLeader->SetNext(manager);
    manager->SetNext(generalManager);

    Request request;
    request.level = 2;

    groupLeader->HandleRequest(request);

    delete groupLeader;
    delete manager;
    delete generalManager;

    return 0;
}

在上述例子中,当传入的请求级别为2时,组长(GroupLeader)对象将能够处理请求,并输出相应的处理消息。如果请求级别为3,则会继续将请求传递给下一个处理者,经理(Manager)对象进行处理。如果请求级别为4,则总经理(GeneralManager)对象将会处理请求。

3 总结

通过使用责任链模式,我们实现了一个动态的请求处理流程,可以简单地添加或移除处理者,而不需要修改客户端代码。这样,可以更灵活地管理和处理请求,并提高系统的可扩展性。

标签:请求,处理,request,模式,next,责任,Handler,HandleRequest,行为
From: https://www.cnblogs.com/luoxiang/p/17823523.html

相关文章

  • 结构型模式-享元模式
    1什么是享元模式享元模式(FlyweightPattern)是一种以共享对象来减少内存使用和提高性能的设计模式。在享元模式中,通过共享尽可能多的相似对象来减少系统中对象的数量。这样可以节省内存和减少对象的创建和销毁所带来的开销。享元模式的核心思想是将对象分为两个部分:内部状态(Intr......
  • 解锁设计模式的神秘面纱:编写无懈可击的代码之单例设计模式
    前言单例设计模式是23种设计模式中最常用的设计模式之一,无论是三方类库还是日常开发几乎都有单例设计模式的影子。单例设计模式提供了一种在多线程情况下保证实例唯一性的解决方案。单例设计模式虽然简单,但是实现方案却非常多,大体上有以下7种最常见的方式。饿汉模式所谓饿汉式,就是......
  • 工厂方法模式
    [实验任务]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。 publicinterfaceEncryption{Stringencrypt(Stringtext);Stringdecrypt(Stringciph......
  • python升级到3.12版本, 开发模式安装包, 在vscode下Pylance无法解析的问题处理
    问题描述在python3.11版本下开发python库,为方便调测,使用开发模式安装包.使用如下命令:pipinstall-e.其中-e参数表示开发模式下安装python包,它并没有把包相关文件拷贝到site-packages目录,而是创建一个链接指向当前的开发库.这样,当自己开发的包修改后会立即生效,......
  • Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
    Go接口:Go中最强大的魔法,接口应用模式或惯例介绍目录Go接口:Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1一切皆组合2.2垂直组合2.2.1第一种:通过嵌入接口构建接口2.2.2第二种:通过嵌入接口构建结构体类型2.2.3第三种:通过嵌入结构体类型构建新结构......
  • flutter 运行的四种模式
    Debug(调试)模式1、这是开发Flutter应用程序时最常用的模式。可以在真机和模拟器上同时运行。重要用于开发和调试阶段。2、可以进行热重载,即在不重新启动应用程序的情况下实时更新代码。3、应用程序会包含用于调试和开发的额外信息和工具(debugging信息、debuggeraids(比如......
  • Kubernetes日志采集Sidecar模式介绍
    Kubernetes(K8S)作为CNCF(cloudnativecomputingfoundation)的一个核心项目,背靠Google和Redhat的强大社区,近两年发展十分迅速,在成为容器编排领域中领导者的同时,也正在朝着PAAS底座标配的方向发展。日志采集方式日志作为任一系统不可或缺的部分,在K8S的官方文档中也介绍了多种的日......
  • java的设计模式之抽象工厂模式
    抽象工厂模式(AvstractFactory)在某些情况下,需要创建一系列相关或相互依赖的对象,这些对象属于一组相关的产品族。同时,系统需要保证这些产品族之间的一致性。如果直接在代码中创建这些对象,会使得代码与具体产品的细节紧密耦合,不利于后续的扩展和维护。抽象工厂模式提供了一个接口,用于......
  • 自建站外贸收款方式?海洋建站支持什么收款模式
    在开展外贸业务时,自建站点是一个常见的选择,但关于收款方式的选择一直是外贸企业关注的焦点之一。本文将探讨自建站外贸收款方式的重要性以及海洋建站支持的收款模式,以帮助您更好地管理国际交易的资金流动。1.选择适合您业务的外贸收款方式在自建外贸网站时,选择合适的外贸收款方式......
  • Xcode自动管理签名模式下更新PP文件
    1、Xcode切换到相应的Target,选择到Signing&Capabilities,找到ProvisioningProfileManagedProfile,旁边有一个Info符号,点击,展示PP文件详情,然后拖动左上角的PP文件图标到桌面,主要是为了获取该PP文件的名字。(如下图) 2、打开 ~/Library/MobileDevice/ProvisioningProfi......