责任链模式中,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;
}