C++ デザイン パターンにおける責任連鎖モデルの簡単な紹介

黄舟
リリース: 2017-01-17 13:42:30
オリジナル
1050 人が閲覧しました

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.ん)!


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート