Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Einführung in das Verantwortungskettenmodell in C++-Entwurfsmustern

Eine kurze Einführung in das Verantwortungskettenmodell in C++-Entwurfsmustern

黄舟
黄舟Original
2017-01-17 13:42:301012Durchsuche

ChainOfResponsibility: Ermöglicht mehreren Objekten die Möglichkeit, Anforderungen zu verarbeiten, wodurch die Kopplungsbeziehung zwischen dem Absender und dem Empfänger der Anforderung vermieden wird. Verketten Sie dieses Objekt und leiten Sie die Anforderung entlang der Kette weiter, bis ein Objekt sie verarbeitet.

Vorteile der Verantwortungskette:

Wenn ein Kunde eine Anfrage sendet, wird die Anfrage entlang der Kette weitergeleitet, bis ein ConcreteHandler-Objekt für die Verarbeitung verantwortlich ist.

Damit weder der Empfänger noch der Absender klare Informationen über die andere Partei haben und die Objekte in der Kette selbst die Struktur der Kette nicht kennen. Das Ergebnis ist, dass Verantwortungsketten das Verknüpfen von Objekten vereinfachen, sodass sie nur einen einzigen Verweis auf ihren Nachfolger und nicht auf alle möglichen Empfänger beibehalten müssen.

Kunde:

[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;
}

Klassenimplementierung:

[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);
    }
};

Das Obige ist der Inhalt eines kurzen Verständnisses des Chain-of-Responsibility-Modells in C++-Entwurfsmustern Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn