`

[行为型模式] 责任链模式的理解

 
阅读更多




头文件
//ChainOfResponsibilityPattern.h

#ifndef CHAIN_OF_RESPONSIBILITY_PATTERN_H
#define CHAIN_OF_RESPONSIBILITY_PATTERN_H

#include <Windows.h>
#include <iostream>
using namespace std;
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }

namespace ChainOfResponsibilityPattern
{
    //////////////////////////////////////////////////////////////////////////
    class HolidayRequest
    {
    public:
        HolidayRequest(int hour);
        int GetHour();

    private:
        int m_iHour;
    };

    //The holiday request handler interface
    class Manager
    {
    public:
        Manager();
        virtual ~Manager();
        virtual bool HandleRequest(HolidayRequest* pRequest) = 0;
    };

    // Project manager
    class PM : public Manager
    {
    public:
        PM(Manager *handler);
        virtual ~PM();
        bool HandleRequest(HolidayRequest* pRequest);

    private:
        Manager *m_pHandler;
    };

    // Department manager
    class DM : public Manager
    {
    public:
        DM(Manager *handler);
        virtual ~DM();
        bool HandleRequest(HolidayRequest* pRequest);

        // The department manager is in?
        bool IsIn();

    private:
        Manager *m_pHandler;
    };

    // Project supervisor
    class PS : public Manager
    {
    public:
        PS(Manager *handler);
        virtual ~PS();
        bool HandleRequest(HolidayRequest* pRequest);

    private:
        Manager *m_pHandler;
    };

    //////////////////////////////////////////////////////////////////////////
    void ChainOfResponsibilityPattern_Test();
}

#endif


实现
#include "ChainOfResponsibilityPattern.h"

namespace ChainOfResponsibilityPattern
{
    //////////////////////////////////////////////////////////////////////////
    HolidayRequest::HolidayRequest(int hour)
        : m_iHour(hour)
    {}

    int HolidayRequest::GetHour()
    {
        return m_iHour;
    }

    //////////////////////////////////////////////////////////////////////////
    Manager::Manager(){}
    Manager::~Manager(){}

    //////////////////////////////////////////////////////////////////////////
    PM::PM(Manager *handler)
        : m_pHandler(handler)
    {}

    PM::~PM()
    {}

    bool PM::HandleRequest(HolidayRequest *pRequest)
    {
        if (pRequest->GetHour() <= 2 || m_pHandler == NULL)
        {
            cout<<"PM said:OK, it's Over!"<<endl;
            return true;
        }
        else
        {
            cout<<"PM said:OK, transfer to next Manager."<<endl;
            return m_pHandler->HandleRequest(pRequest);
        }
    }

    // Department manager
    //////////////////////////////////////////////////////////////////////////
    DM::DM(Manager *handler)
        : m_pHandler(handler)
    {}
    
    DM::~DM()
    {}
    
    bool DM::HandleRequest(HolidayRequest *pRequest)
    {
        cout<<"DM said:OK, it's Over!"<<endl;
        return true;
    }

    // The department manager is in?
    bool DM::IsIn()
    {
        return true;
    }

    // Project supervisor
    //////////////////////////////////////////////////////////////////////////
    PS::PS(Manager *handler)
        : m_pHandler(handler)
    {}

    PS::~PS()
    {}

    bool PS::HandleRequest(HolidayRequest *pRequest)
    {
        DM *pDM = dynamic_cast<DM *>(m_pHandler);
        if (pDM != NULL)
        {
            if (pDM->IsIn())
            {
                return pDM->HandleRequest(pRequest);
            }
        }

        cout<<"PS said:OK, it's Over!"<<endl;
        return true;
    }

    //////////////////////////////////////////////////////////////////////////
    void ChainOfResponsibilityPattern_Test()
    {
        DM *pDM = new DM(NULL);
        PS *pPS = new PS(pDM);
        PM *pPM = new PM(pPS);
        HolidayRequest *pHolidayRequest = new HolidayRequest(10);
        pPM->HandleRequest(pHolidayRequest);
        SAFE_DELETE(pHolidayRequest);

        pHolidayRequest = new HolidayRequest(2);
        pPM->HandleRequest(pHolidayRequest);

        SAFE_DELETE(pDM);
        SAFE_DELETE(pPS);
        SAFE_DELETE(pPM);
        SAFE_DELETE(pHolidayRequest);
    }
}


客户端
#include "ChainOfResponsibilityPattern.h"


#include <iostream>
using namespace std;
using namespace ChainOfResponsibilityPattern;
void main()
{
    ChainOfResponsibilityPattern_Test();
}



PM said:OK,transfer to next Manager.
DM said:OK,it's Over!
PM said:OK,it's Over!
分享到:
评论

相关推荐

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    4. **责任链模式**:责任链模式是行为型设计模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。在这个模式中,请求沿着处理者链进行传递,每个处理者都有机会处理请求,或者将请求传递...

    设计模式_行为型_责任链模式.md

    责任链模式是一种行为型设计模式,用于处理程序中的请求。该模式通过建立一条链式结构,使得多个对象都有机会处理请求,从而达到解耦发送者和接收者的目的。在责任链模式中,请求沿着链从一个对象传递到下一个对象,...

    spring责任链模式详解

    责任链模式是软件设计模式中的一种行为模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象处理该请求。在Spring框架中,责任链模式被广泛应用于AOP(面向切面编程)和事件处理等场景。下面将详细阐述责任...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    3. **责任链模式**:在对象链中传递请求,由链上的对象决定是否处理该请求,使得系统可以在不影响客户端的情况下动态调整责任分配。 4. **策略模式**:定义一组可互换的算法,并封装起来,使得它们可以相互替换,...

    设计模式之责任链模式源码

    责任链模式是设计模式中的一种行为模式,它允许在对象之间建立一条处理请求的链条,每个对象都包含对请求的处理逻辑,以及将请求传递给下一个对象的能力。这种模式使得请求可以在链上的对象之间传递,直到被某个对象...

    设计模式-责任链模式

    责任链模式是一种行为设计模式,它允许我们把请求沿着处理者对象的链式结构进行传递,直到某个对象处理这个请求。这种模式使得我们能够将请求的发送者与接收者解耦,同时也允许在运行时动态地改变处理顺序或添加新的...

    设计模式之责任链模式

    责任链模式是一种行为设计模式,它允许我们把请求沿着处理者链进行传递,直到某个处理者处理这个请求。这种模式让请求的发送者和接收者解耦,因为发送者无需知道哪个对象会处理请求,接收者也不知道其他处理者的存在...

    设计模式之责任链模式Java实现

    责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求为止。在Java中,我们可以通过接口和类的组合来实现这种模式。让我们深入探讨...

    设计模式之责任链模式(Chain)

    责任链模式是一种行为设计模式,它的核心思想是将请求的发送者和接收者解耦,通过将多个处理对象串联成一个处理链,使得请求沿着这个链进行传递,直到被某个对象处理。这种模式使得系统更加灵活,可以在运行时动态...

    责任链模式学习

    责任链模式是一种行为设计模式,它允许我们定义一系列处理请求的对象,这些对象形成一个链,请求沿着这个链传递,直到某个对象能够处理它。这种方式使得我们可以将请求的发送者和接收者解耦,同时增加了系统扩展的...

    【设计模式】之责任链模式1

    责任链模式是一种行为设计模式,它允许将请求沿着处理者对象的链进行发送,而接收者可以在链中的任何位置处理该请求。这种模式的核心思想是将处理请求的对象组织成一个链条,每个对象(节点)都包含对下个处理者的...

    责任链模式Demo

    责任链模式是一种行为设计模式,它允许我们定义一系列对象,这些对象可以按顺序处理请求,每个对象都可以处理请求的一部分或全部,并将未处理的请求传递给链中的下一个对象。这种模式使得请求的发送者无需知道哪个...

    设计模式3-行为型模式

    **Chain of Responsibility(职责链)模式**是一种行为模式,它的主要动机是减少请求发送者与接收者之间的耦合。在软件开发中,有时一个请求可能由多个对象处理,但最终只有一个对象会真正处理这个请求。职责链模式...

    java设计模式之责任链模式

    责任链模式是软件设计模式中的一种行为模式,它允许在对象之间传递请求,同时让接收者决定是否处理这个请求。这种模式将请求的发送者和接收者解耦,使得多个对象都有机会处理一个请求,而无需显式指定具体的处理者。...

    设计模式C++学习之责任链模式(Chain of Responsibility)

    责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求。这种模式的主要优点是解耦了发送者和接收者之间的关系,使得系统更加灵活,...

    java 责任链模式

    责任链模式是软件设计模式中的一种行为模式,它允许在对象之间建立一条链,并将请求沿着这条链传递,直到某个对象处理该请求。在Java中,责任链模式可以帮助我们实现松耦合,使得请求处理者与请求发起者之间无需直接...

    责任链模式Simple

    责任链模式(Chain of Responsibility)是一种行为设计模式,它的核心思想是将一系列处理请求的对象组织成一条链,并在链上的每个对象中定义处理请求的方法。当一个请求沿着链传递时,每个对象都有机会处理该请求,...

Global site tag (gtag.js) - Google Analytics