C++设计模式-责任链模式理解及demo

责任链模式中,ConcreteHandler将自己的后继对象(向下传递信息的对象)记录在自己的后继表中,当一个请求到来时,ConcreteHandler会先检查看自己有没有匹配的处理程序,如果有就自己处理,否则传递给它的后继处理,ConcreteHandler只是简单的检查看自己有没有后继,有的话将请求传递给后继进行处理,没有的话就自己处理。

#pragma once

class Handle

{

public:

         Handle();

         Handle(Handle *pSucc);

         virtual ~Handle();

         virtual void HandleRequest() = 0;

         void SetSuccessor(Handle *pSucc);

         Handle* GetSuccessor();

 

protected:

private:

         Handle * m_pSucc;

};

 

 

class ConcreteHandleA :public Handle

{

public:

         ConcreteHandleA();

         ~ConcreteHandleA();

         ConcreteHandleA(Handle *pSucc);

         void HandleRequest();

 

protected:

 

private:

 

};

 

class ConcreteHandleB : public Handle

{

public:

         ConcreteHandleB();

         ~ConcreteHandleB();

         ConcreteHandleB(Handle *pSucc);

         void HandleRequest();

 

protected:

private:

 

};

 

#include "Responsibility.h"

#include <iostream>

using namespace std;

Handle::Handle()

{

         m_pSucc = nullptr;

}

Handle::Handle(Handle *pSucc)

{

         m_pSucc = pSucc;

}

Handle::~Handle()

{

         if (m_pSucc)

         {

                   delete m_pSucc;

                   m_pSucc = nullptr;

         }

}

void Handle::SetSuccessor(Handle *pSucc)

{

         this->m_pSucc = pSucc;

}

 

Handle* Handle::GetSuccessor()

{

         return m_pSucc;

}

 

ConcreteHandleA::ConcreteHandleA()

{

 

}

 

ConcreteHandleA::ConcreteHandleA(Handle *pSucc) :Handle(pSucc)

{

 

}

 

void ConcreteHandleA::HandleRequest()

{

         if (this->GetSuccessor() != nullptr)

         {

                   std::cout << "ConcreteHandleA.... next deal..." << std::endl;

                   this->GetSuccessor()->HandleRequest();

         }

         else

         {

                   std::cout << "ConcreteHandleA not successor,deal by self" << std::endl;

         }

}

 

ConcreteHandleA::~ConcreteHandleA()

{

 

}

 

ConcreteHandleB::ConcreteHandleB()

{

 

}

 

ConcreteHandleB::ConcreteHandleB(Handle *pSucc)

{

 

}

 

void ConcreteHandleB::HandleRequest()

{

         if (this->GetSuccessor() != nullptr)

         {

                   std::cout << " ConcreteHandleB::HandleRequest..." << std::endl;

                   this->GetSuccessor()->HandleRequest();

         }

         else

         {

                   std::cout << " ConcreteHandleB::HandleRequest deal by self" << std::endl;

         }

}

 

ConcreteHandleB::~ConcreteHandleB()

{

 

}

 

int main(int argc, char* argv[])

{

 

         ConcreteHandleA *pHandleA = new ConcreteHandleA();

         ConcreteHandleB *pHangleB = new ConcreteHandleB();

         pHandleA->SetSuccessor(pHangleB);

         pHandleA->HandleRequest();

         pHangleB->HandleRequest();

         return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值