Chain Of Responsibility模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
class Reason {
public:
Reason(const char* reason);
bool IsReasonable();
private:
string reason;
}
// request
class Request {
public:
Request(int day, const char* reason);
int Day();
Reason* GetReason();
private:
int day;
Reason* reason;
}
// handler
class RequestHandler {
public:
virtual bool HandleRequest(Request* req);
virtual void SetSuccessor(RequestHandler* successor);
private:
RequestHandler* successor;
}
// manager
class Manager: public RequestHandler {
public:
virtual bool HandleRequest(Request* req);
}
bool Manager::HandleRequest(Request* req) {
if (req->GetReason()->IsReasonable() && req->Day() < 1) {
return true;
}
return successor->HandleRequest(req);
}
// chief inspector
class ChiefInspector: public RequestHandler {
public:
virtual bool HandleRequest(Request* req);
}
bool ChiefInspector::HandleRequest(Request* req) {
if (req->GetReason()->IsReasonable() && req->Day() < 3) {
return true;
}
return successor->HandleRequest(req);
}
// CEO
class CEO: public RequestHandler {
public:
virtual bool HandleRequest(Request* req);
}
bool CEO::HandleRequest(Request* req) {
if (req->GetReason()->IsReasonable()) {
return true;
}
return false;
}
// test
void Test() {
Request* request = new Request(5, "playing game");
RequestHandler* manager = new Manager();
RequestHandler* ci = new ChiefInspector();
RequestHandler* ceo = new CEO();
manager->SetSuccessor(ci);
ci->SetSuccessor(ceo);
manager->HandleRequest(request);
// todo ... destroy
}
PS. 我的设计模式系列blog, 《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。