Modèle de conception C brève introduction au modèle médiateur

黄舟
Libérer: 2017-01-17 13:41:03
original
1358 Les gens l'ont consulté

Modèle médiateur (Mediator) : utilisez un objet médiateur pour encapsuler une série d'interactions d'objets. Les médiateurs éliminent le besoin pour les objets de se référencer explicitement les uns les autres, desserrant ainsi le couplage et leur permettant de modifier indépendamment leurs interactions.

Quatre rôles :

Médiateur abstrait Médiateur

Objet médiateur concret ConcreteMediator

Classe abstraite Abstract

Classe abstraite concrète ConcreteAbstract

Avantages du modèle Mediator :

L'émergence de Mediator réduit le couplage de chaque résumé, permettant à chaque classe abstraite et médiateur d'être modifiés et réutilisés indépendamment.

Puisque nous faisons abstraction de la manière dont les objets collaborent, nous traitons la médiation comme un concept indépendant et l'encapsulons dans un objet. De cette manière, l'attention se déplace du comportement des objets eux-mêmes vers l'interaction entre eux. c'est-à-dire regarder le système d'un point de vue plus objectif.

Inconvénients du modèle du médiateur :

Puisque ConcreteMediator contrôle la centralisation, la complexité de l'interaction devient la complexité du médiateur, ce qui rend le médiateur plus complexe que n'importe quel ConcreteAbstract All responsable.

Implémentation du modèle :

[code]//前向声明
class Abstract;

//中介者抽象类
class Mediator{
public:
    virtual void Send(std::string message, Abstract *abstract){}
};

//抽象类
class Abstract{
protected:
    Mediator *mediator;
public:
    //构造中介者
    Abstract(Mediator *mediator){
        this->mediator = mediator;
    }
};

//具体抽象类1
class ConcreteAbstract1: public Abstract{
public:
    ConcreteAbstract1(Mediator *me):Abstract(me){}
    void Send(std::string message){
        //中介者送出去
        mediator->Send(message, this);
    }
    void Notify(std::string message){
        std::cout << "ConcreteAbstract1 receive message: " << message << "   ---(From ConcreteAbstract2)" << std::endl;
    }
};

//具体抽象类2
class ConcreteAbstract2: public Abstract{
public:
    ConcreteAbstract2(Mediator *me):Abstract(me){}
    void Send(std::string message){
        //中介者送出去
        mediator->Send(message, this);
    }
    void Notify(std::string message){
        std::cout << "ConcreteAbstract2 receive message: "  << message << "   ---(From ConcreteAbstract1)" << std::endl;
    }
};

//具体中介者
class ConcreteMediator: public Mediator{
private:
    //需了解所存的具体抽象类对象
    ConcreteAbstract1 *CA1;
    ConcreteAbstract2 *CA2;
public:
    ConcreteMediator(){}
    void setConcreteMediator(ConcreteAbstract1 *CA1, ConcreteAbstract2 *CA2){
        this->CA1 = CA1;
        this->CA2 = CA2;
    }
    virtual void Send(std::string message, Abstract *abstract){
        if(abstract == CA1)
            CA2->Notify(message);
        else
            CA1->Notify(message);
    }
};
Copier après la connexion

Client :

[code]//Client
int main(){
    ConcreteMediator *m = new ConcreteMediator;

    //具体的抽象这认识具体的中介者
    ConcreteAbstract1 *ca1 = new ConcreteAbstract1(m);
    ConcreteAbstract2 *ca2 = new ConcreteAbstract2(m);
    //让中介者认识两个具体的抽象类
    m->setConcreteMediator(ca1, ca2);

    ca1->Send("Hello");  //Output: ConcreteAbstract2 receive message: Hello   ---(From ConcreteAbstract1)
    ca2->Send("Hi");    //Output: ConcreteAbstract1 receive message: Hi   ---(From ConcreteAbstract2) 

    if(m != NULL){
        delete m;
        m = NULL;
    }
    if(ca1 != NULL){
        delete ca1;
        ca1 = NULL;
    }
    if(ca2 != NULL){
        delete ca2;
        ca2 = NULL;
    }

    return 0;
}
Copier après la connexion

Ce qui précède est le contenu du modèle de conception C, brève introduction au modèle intermédiaire Pour un contenu plus connexe. , veuillez faire attention au site Web PHP chinois (www.php.cn) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal