设计模式之职责链模式(ChainOfResponsibility)的C++实现

这篇具有很好参考价值的文章主要介绍了设计模式之职责链模式(ChainOfResponsibility)的C++实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、职责链模式的提出

在软件开发过程中,发送者经常发送一个数据请求给特定的接收者对象,让其对请求数据进行处理(一个数据请求只能有一个对象对其处理)。如果发送的每个数据请求指定特定的接收者, 将带来发送者与接收者的紧密解耦合问题。职责链模式可以将请求发送者与接收者解耦。职责链模式的处理流程是:设计一个职责链处理基类,该类具有指向下一个待处理类的变量,通过set接口设置下一个待处理的链对象成员;该类具有遍历处理请求的功能,遍历过程中,只要有一个对象处理了请求,则停止遍历;该基类抽象了2个接口分别为:判断是否处理该类型请求和处理消息的功能接口。其他的具体职责链类继承并实现职责链基类的接口。

2、需求描述

有3个职责功能类,每个职责类都只能对特定的请求数据类型进行处理,现有3个请求类型。设计一个能处理不同数据请求的功能代码,该功能代码具有良好的扩展性。数据请求的类型包括:请求类型和描述信息。

3、功能实现

(1)UML图如下:

设计模式之职责链模式(ChainOfResponsibility)的C++实现,设计模式,设计模式

 

(2)代码实现如下:

#include <iostream>
#include <string>
enum class EmType
{
    EM_TYPE_A,
    EM_TYPE_B,
    EM_TYPE_C
};

class RequestData
{
private:
    std::string m_strDesc;
    EmType      m_emType;
public:
    RequestData(const std::string& desc,EmType type):m_strDesc(std::move(desc)),m_emType(type){};
    EmType  getType()const{return m_emType;};
    const std::string getDesc()const{return m_strDesc;};
};


class ChainHandler
{
protected:
    ChainHandler* nextChain{nullptr};
    virtual void processHandler(const RequestData& request)=0;
    virtual bool IsHandlerType(const RequestData& request)=0;
public:
    void setNextChain(ChainHandler* next)
    {
      nextChain = next;
    };

    void handle(const RequestData& req)
    {
        if(IsHandlerType(req))
        {
            processHandler(req);
        }else
        {
            if(nextChain != nullptr)
            {
                nextChain->handle(req);
            }
        }
    }
    virtual ~ChainHandler(){};
};

class HanderA:public ChainHandler
{
public:
    virtual bool IsHandlerType(const RequestData &request) override
    {
        if(request.getType() == EmType::EM_TYPE_A)
        {
            return true;
        }else
        {
            std::cout << "HanderA cannot process the request:" << request.getDesc() << std::endl;
            return false;
        }

    }
    virtual void processHandler(const RequestData& request) override
    {
        std::cout << "HanderA is processing the request: " << request.getDesc() << std::endl;
    }
};

class HanderB:public ChainHandler
{
public:
    virtual bool IsHandlerType(const RequestData &request) override
    {
        if(request.getType() == EmType::EM_TYPE_B)
        {
            return true;
        }else
        {
            std::cout << "HanderB cannot process the request:" << request.getDesc() << std::endl;
            return false;
        }
    }
    virtual void processHandler(const RequestData& request) override
    {
        std::cout << "HanderB is processing the request: " << request.getDesc() << std::endl;
    }
};

class HanderC:public ChainHandler
{
public:
    virtual bool IsHandlerType(const RequestData &request) override
    {
        if(request.getType() == EmType::EM_TYPE_C)
        {
            return true;
        }else
        {
            std::cout << "HanderC cannot process the request:" << request.getDesc() << std::endl;
            return false;
        }
    }
    virtual void processHandler(const RequestData& request) override
    {
        std::cout << "HanderC is processing the request: " << request.getDesc() << std::endl;
    }
};

class Client
{
public:
    void doWork()
    {
        ChainHandler* handlerA = new HanderA();
        ChainHandler* handlerB = new HanderB();
        ChainHandler* handlerC = new HanderC();
        handlerA->setNextChain(handlerB);
        handlerB->setNextChain(handlerC);

        RequestData reqA("DataA need to handle",EmType::EM_TYPE_A);
        handlerA->handle(reqA);
        std::cout << "\n************** next Request ********************\n" << std::endl;
        RequestData reqC("DataC need to handle",EmType::EM_TYPE_C);
        handlerA->handle(reqC);

        delete handlerA;
        delete handlerB;
        delete handlerC;

        handlerA = nullptr;
        handlerB = nullptr;
        handlerC = nullptr;
    }
};

int main()
{
    Client obj;
    obj.doWork();
    return 0;
}

 程序运行结果如下:

设计模式之职责链模式(ChainOfResponsibility)的C++实现,设计模式,设计模式文章来源地址https://www.toymoban.com/news/detail-666650.html

到了这里,关于设计模式之职责链模式(ChainOfResponsibility)的C++实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式-职责链模式

      将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。   这么说比较抽象,我用更加容易理解的话来进一步解读一下。   在职责链模式中,多个处理

    2024年02月04日
    浏览(27)
  • 设计模式(20)职责链模式

    一、介绍: 1、定义:责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。在责任链模式中,当一个对

    2024年02月07日
    浏览(25)
  • 设计模式之~职责链模式

    简述:         职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这里发出这个请求的客户端并不知道这当中的哪一个对象

    2024年02月07日
    浏览(22)
  • 设计模式原则之:单一职责模式

      对类来说的,即一个类应该只负责一项职责。如类A负责两个不同的职责,职责1,职责2。当职责1需求变更而改变A时,可能造成职责2智行错误,所以要将类A的粒度分解为A1,A2

    2024年02月15日
    浏览(30)
  • js设计模式:职责链模式

    可以处理链式调用的业务逻辑,下一步操作需要上一步操作的处理结果 可以使用职责链模式进行解耦操作,按顺序链向下传递,依次向下查找可以处理的业务逻辑

    2024年02月21日
    浏览(25)
  • 设计模式—— 单一职责原则

    1,代码重用性(即:相同功能的代码,不用多次编写) 2,可读性(即:编程规范性,便于其他程序员的阅读和理解) 3,可扩展性(当需要增加新的功能时,非常的方便,称为可维护性) 4,可靠性(即:当我们增加新的功能时,对原来的功能没有影响) 5,使程序呈现高内

    2024年02月12日
    浏览(30)
  • 【设计模式之禅】单一职责

    最近前辈推荐我读《设计模式之禅》这本书,原因是我写的代码质量实在是一言难尽,开发速度很快,但是bug数就很多了,设计原则这种知识就需要掌握 写这篇文主要是记录自己的学习以及督促自己 第一章【单一职责】 从我理解的层面来谈谈单一原则:明确每个类每个方法

    2024年02月13日
    浏览(27)
  • 软件设计模式系列之十五——职责链模式

    职责链模式(Chain of Responsibility Pattern)也称为责任链模式,是一种结构型设计模式,用于构建一条对象处理请求的责任链。在这个模式中,多个对象依次处理请求,直到其中一个对象能够处理该请求为止。职责链模式将请求的发送者和接收者解耦,允许多个对象都有机会处理

    2024年02月08日
    浏览(25)
  • 设计模式—职责链模式(Chain of Responsibility)

    目录 思维导图 什么是职责链模式? 有什么优点呢? 有什么缺点呢? 什么场景使用呢? 代码展示 ①、职责链模式 ②、加薪代码重构 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有

    2024年02月10日
    浏览(24)
  • 设计模式--职责链模式(Chain of Responsibility Pattern)

    职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它为请求创建了一个接收者对象的链。 这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在职责链模式中,通常每个接收者都包含对另一个接收者的引用。如果

    2024年02月20日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包