责任链模式
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
#include <iostream> #include <string> using namespace std; // 请求 class Request { public: int m_nNumber; }; // 管理者 class Manager { public: Manager(string temp) { name = temp; } void SetSuccessor(Manager* temp) { manager = temp; } virtual void GetRequest(Request* request) = 0; protected: Manager* manager; string name; }; // 经理 class CommonManager : public Manager { public: CommonManager(string strTemp) : Manager(strTemp) {} virtual void GetRequest(Request* request); }; void CommonManager::GetRequest(Request* request) { if (request->m_nNumber>=0 && request->m_nNumber<1000) { cout << name << " 处理了请求: " << request->m_nNumber << endl; } else { manager->GetRequest(request); } } // 总监 class Majordomo : public Manager { public: Majordomo(string strTemp) : Manager(strTemp) {} virtual void GetRequest(Request* request); }; void Majordomo::GetRequest(Request* request) { if (request->m_nNumber <= 5000) { cout << name << " 处理了请求: " << request->m_nNumber << endl; } else { manager->GetRequest(request); } } //总经理 class GeneralManager: public Manager { public: GeneralManager(string name):Manager(name) {} virtual void GetRequest(Request* request) //总经理可以处理所有请求 { cout << name << " 处理了请求: " << request->m_nNumber << endl; } }; int main() { Manager* common = new CommonManager("张经理"); Manager* major = new Majordomo("李总监"); GeneralManager* general = new GeneralManager("赵总"); common->SetSuccessor(major); major->SetSuccessor(general); Request* rq = new Request(); rq->m_nNumber = 999; common->GetRequest(rq); rq->m_nNumber = 4999; common->GetRequest(rq); rq->m_nNumber = 6999; common->GetRequest(rq); delete rq; delete major; delete common; delete general; return 0; }
1.要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当.
2.责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。
3.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。
优质内容筛选与推荐>>