ChainOfResponsibility: 複数のオブジェクトにリクエストを処理する機会を与えることで、リクエストの送信者と受信者の間の結合関係を回避します。このオブジェクトをチェーンし、オブジェクトが処理するまでチェーンに沿ってリクエストを渡します。
責任の連鎖の利点:
クライアントがリクエストを送信すると、リクエストは ConcreteHandler オブジェクトが処理を担当するまでチェーンに沿って渡されます。
そのため、受信者も送信者も相手に関する明確な情報を持っておらず、チェーン内のオブジェクト自体はチェーンの構造を知りません。その結果、責任の連鎖によってオブジェクトのリンクが簡素化され、すべての候補受信者ではなく、後続者への単一の参照のみを維持するだけで済みます。
クライアント:
[code]//Client int main(){ Handler *h1 = new ConcreteHandler; Handler *h2 = new ConcreteHandler2; Handler *h3 = new ConcreteHandler3; //设置职责链上家与下家 h1->setSuccessor(h2); h2->setSuccessor(h3); //请求 int request[8] = {2, 5, 14, 22, 18, 3, 23, 20}; //循环给最小处理者提交请求,不同的数额由不同权限处理者处理 for(auto i = 0; i < 8; ++i){ h1->HandleRequest(request[i]); } // Output: // Handler request // Handler request // Handler2 request // Handler3 request // Handler2 request // Handler request // Handler3 request // Handler3 request return 0; }
クラス実装:
[code]//Handler处理类 class Handler{ protected: Handler *successor; public: //设置继任者 void setSuccessor(Handler *successor){ this->successor = successor; } //处理请求的抽象方法 virtual void HandleRequest(int request){} }; //具体处理类,处理它们负责的请求,可访问的后继者,如果可以处理该请求,就处理之,否则就将该请求转发给它的后继者 class ConcreteHandler: public Handler{ public: virtual void HandleRequest(int request)override{ //0~10在此处理 if(request >= 0 && request < 10){ std::cout << "Handler request\n"; }else if(successor != NULL) //否则转移到下一位 successor->HandleRequest(request); } }; class ConcreteHandler2: public Handler{ public: virtual void HandleRequest(int request)override{ //10~20在此处理 if(request >= 10 && request < 20){ std::cout << "Handler2 request\n"; }else if(successor != NULL) //否则转移到下一位 successor->HandleRequest(request); } }; class ConcreteHandler3: public Handler{ public: virtual void HandleRequest(int request)override{ //20~30在此处理 if(request >= 20 && request < 30){ std::cout << "Handler3 request\n"; }else if(successor != NULL) //否则转移到下一位 successor->HandleRequest(request); } };
上記は、C++ デザイン パターンの責任チェーン モデルを簡単に理解するための内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.ん)!