• 大话设计模式--中介者模式 Mediator --C++实现实例


    1. 中介者模式: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立改变他们之间的交互。

    Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator.

    由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者变为比任何一个ConcreteColleague都复杂。

    中介者模式一般应用于一组对象以定义良好但复杂的方式进行通信的场合,以及想定制一个分部在多个类中的行为,而又不想生成太多的子类的场合。

    实例:

    colleague.h colleague.cpp

    #ifndef COLLEAGUE_H
    #define COLLEAGUE_H
    
    class Mediator;
    
    class Colleague
    {
    public:
        Colleague(Mediator *mediator);
    
    protected:
        Mediator *mediator;
    };
    
    #endif // COLLEAGUE_H
    #include "colleague.h"
    #include "mediator.h"
    
    Colleague::Colleague(Mediator *mediator)
    {
        this->mediator = mediator;
    }


    concretecolleague1.h concretecolleague1.cpp

    #ifndef CONCRETECOLLEAGUE1_H
    #define CONCRETECOLLEAGUE1_H
    
    #include "colleague.h"
    #include "mediator.h"
    #include <string>
    using namespace std;
    
    class ConcreteColleague1 : public Colleague
    {
    public:
        ConcreteColleague1(Mediator *mediator);
        void send(string message);
        void notify(string message);
    };
    
    #endif // CONCRETECOLLEAGUE1_H
    #include "concretecolleague1.h"
    #include <iostream>
    using namespace std;
    
    ConcreteColleague1::ConcreteColleague1(Mediator *mediator) : Colleague(mediator)
    {    
    }
    
    void ConcreteColleague1::send(string message)
    {
        mediator->send(message, this);
    }
    
    void ConcreteColleague1::notify(string message)
    {
        cout << "Colleague1 get a message: " << message << endl;
    }


    concretecolleague2.h concretecolleague2.cpp

    #ifndef CONCRETECOLLEAGUE2_H
    #define CONCRETECOLLEAGUE2_H
    
    #include "colleague.h"
    #include "mediator.h"
    #include <string>
    using namespace std;
    
    class ConcreteColleague2 : public Colleague
    {
    public:
        ConcreteColleague2(Mediator *mediator);
        void send(string message);
        void notify(string message);
    };
    
    #endif // CONCRETECOLLEAGUE2_H
    #include "concretecolleague2.h"
    #include <iostream>
    using namespace std;
    
    ConcreteColleague2::ConcreteColleague2(Mediator *mediator) : Colleague(mediator)
    {
    }
    
    void ConcreteColleague2::send(string message)
    {
        mediator->send(message, this);
    }
    
    void ConcreteColleague2::notify(string message)
    {
        cout << "Colleague2 get a message: " << message << endl;
    }

    mediator.h mediator.cpp

    #ifndef MEDIATOR_H
    #define MEDIATOR_H
    
    #include "colleague.h"
    #include <string>
    using namespace std;
    
    class Mediator
    {
    public:
        Mediator();
        void virtual send(string message, Colleague *colleague)=0;
    };
    
    #endif // MEDIATOR_H
    #include "mediator.h"
    
    Mediator::Mediator()
    {
    }


    concretemediator.h concretemediator.cpp

    #ifndef CONCRETEMEDIATOR_H
    #define CONCRETEMEDIATOR_H
    
    #include "mediator.h"
    #include "concretecolleague1.h"
    #include "concretecolleague2.h"
    
    class ConcreteMediator : public Mediator
    {
    public:
        ConcreteMediator();
        void setcolleague1(ConcreteColleague1 *colleague);
        void setcolleague2(ConcreteColleague2 *colleague);
        void send(string message, Colleague *colleague);
    
    private:
        ConcreteColleague1 *colleague1;
        ConcreteColleague2 *colleague2;
    };
    
    #endif // CONCRETEMEDIATOR_H
    #include "concretemediator.h"
    
    ConcreteMediator::ConcreteMediator()
    {
    }
    
    void ConcreteMediator::send(string message, Colleague *colleague)
    {
        if( colleague == colleague1  )
            colleague2->notify(message);
        else
            colleague1->notify(message);
    
    }
    
    void ConcreteMediator::setcolleague1(ConcreteColleague1 *colleague)
    {
        this->colleague1 = colleague;
    }
    
    void ConcreteMediator::setcolleague2(ConcreteColleague2 *colleague)
    {
        this->colleague2 = colleague;
    }


    main.cpp

    #include <iostream>
    #include "concretecolleague1.h"
    #include "concretecolleague2.h"
    #include "concretemediator.h"
    using namespace std;
    
    int main()
    {
        cout << "Mediator test!" << endl;
    
        ConcreteMediator *m = new ConcreteMediator();
        ConcreteColleague1 *c1 = new ConcreteColleague1(m);
        ConcreteColleague2 *c2 = new ConcreteColleague2(m);
        m->setcolleague1(c1);
        m->setcolleague2(c2);
        c1->send("I come from C1, how are you? ");
        c2->send("I come from C2, I am fine. ");
    
        return 0;
    }







     

  • 相关阅读:
    Java Platform SE binary已停止运行 Can't load AMD 64-bit.dll on a IA 32-bit platform错误
    ORACLE PL/SQL编程之触发器
    JVM年轻代(young generation)老年代(old generation tenured)持久代(permanent generation)GC
    在JVM中,新生代和旧生代有何区别?GC的回收方式有几种?server和client有和区别?
    spring的笔记1 关云长
    雷林鹏分享:Java 流(Stream)、文件(File)和IO
    雷林鹏分享:Java 方法
    雷林鹏分享:Java 正则表达式
    雷林鹏分享:Java 日期时间
    雷林鹏分享:Java 数组
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648092.html
Copyright © 2020-2023  润新知