潍坊手机网站建设公司,美容院网站源码,硬件开发管理流程,婺源做微信网站动机#xff08;Motivation#xff09; 
在软件构建过程中#xff0c;一个请求可能被多个对象处理#xff0c;但是每个请求在运行时只能有个接受者#xff0c;如果显示指定#xff0c;将必不可少地带来请求者与接受者的紧耦合。 
如何使请求的发送者不需要指定具体的接受…动机Motivation 
在软件构建过程中一个请求可能被多个对象处理但是每个请求在运行时只能有个接受者如果显示指定将必不可少地带来请求者与接受者的紧耦合。 
如何使请求的发送者不需要指定具体的接受者让请求的接受者自己在运行是决定来处理请求从而两者解耦。 
模式定义 
使多个对象都有机会处理请求从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链并沿着这条链传递请求直到有一个请求处理他为止。 
#include iostream
#include stringusing namespace std;enum class RequestType {REQ_HANDLER1,REQ_HANDLER2,REQ_HANDLER3,
};class Request {string description;RequestType reqType;
public:Request(const string desc, RequestType type) : description(desc), reqType(type) {}RequestType getReqType() const { return reqType; }const string getDescription() const { return description; }
};class ChainHandler {ChainHandler* nextChain;void sendRequestToNextHandler(const Request req) {if (nullptr ! nextChain) {nextChain-handle(req);}}
protected:virtual bool canHandleRequest(const Request req)  0;virtual void processRequest(const Request req)  0;
public:ChainHandler() { nextChain  nullptr; }void setNextChain(ChainHandler* next) { nextChain  next; }void handle(const Request req) {if (canHandleRequest(req)) {processRequest(req);}else{sendRequestToNextHandler(req);}}
};class Handler1 : public ChainHandler {
protected:virtual bool canHandleRequest(const Request req) override {return req.getReqType()  RequestType::REQ_HANDLER1;}virtual void processRequest(const Request req) override {cout  Handler1 is handle request:   req.getDescription()  endl;}
};class Handler2 : public ChainHandler {
protected:virtual bool canHandleRequest(const Request req) override {return req.getReqType()  RequestType::REQ_HANDLER2;}virtual void processRequest(const Request req) override {cout  Handler2 is handle request:   req.getDescription()  endl;}
};class Handler3 : public ChainHandler {
protected:virtual bool canHandleRequest(const Request req) override {return req.getReqType()  RequestType::REQ_HANDLER3;}virtual void processRequest(const Request req) override {cout  Handler3 is handle request:   req.getDescription()  endl;}
};int main() {Handler1 h1;Handler1 h2;Handler1 h3;h1.setNextChain(h2);h2.setNextChain(h3);Request req(process task ..., RequestType::REQ_HANDLER3);h1.handle(req);return 0;
}要点总结 
Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者但是最后真正的接受者只有一个“这时候请求发送者与接受者的耦合有可能出现”变化脆弱“的症状指责链的目的就是将两者解耦从而更好地应对变化。 
应用了Chain of Responsibility模式后对象的职责分派将更具灵活性。我们可以在运行时动态增加/修改请求的处理职责。 
如果请求传递到职责链的末尾乃得不到处理应该有一个合理的缺省机制。这也使每一个接受对象的职责而不是发出请求的对象的职责。