中介者模式(Mediator)

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

  类图:

  适用性:

  • 一组对象以定义良好但是复杂的方式进行通信。因为这组类之间的相互关系错综复杂,如果直接管理会十分困难,因此利用中介者管理它们的关系,而Client只需要知道中介者的接口即可。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

  优缺:

  • 减少了子类的生成。
  • 它将各Colleague解耦。
  • 它简化了对象协议。由多对多变成一对多。
  • 它对对象如何写作进行了抽象。将注意力从对象各自本身的行为转移到它们之间的交互上来。
  • 它使控制集中化。将对象间交互的复杂性变为中介者的复杂性,可能使得中介者自身成为一个难于维护的庞然大物。

  模板代码:

#include <iostream>

#include <string>

using namespace std;



class Colleague;



class Mediator {

public:

    virtual void send(string message, Colleague *pColleague) = 0;

};



class Colleague {

public:

    Colleague(Mediator *pMediator) { m_pMediator = pMediator; }

    void notify(string message) { cout << "Got message : " << message << endl; }

protected:

    Mediator *m_pMediator;

};



class ConcreteColleague1 : public Colleague {

public:

    ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator) {}

    void send(string message) { m_pMediator->send(message, this); }

    void notify(string message) { cout << "Colleague1 got message : " << message << endl; }

};



class ConcreteColleague2 : public Colleague {

public:

    ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator) {}

    void send(string message) { m_pMediator->send(message, this); }

    void notify(string message) { cout << "Colleague2 got message : " << message << endl; }

};



class ConcreteMediator : public Mediator {

public:

    void setColleague1(ConcreteColleague1 *pColleague1) {

        m_pColleague1 = pColleague1;

    }

    void setColleague2(ConcreteColleague2 *pColleague2) {

        m_pColleague2 = pColleague2;

    }

    void send(string message, Colleague *pColleague) {

        if(pColleague == m_pColleague1) {

            m_pColleague2->notify(message);

        }

        else {

            m_pColleague1->notify(message);

        }

    }



private:

    ConcreteColleague1 *m_pColleague1;

    ConcreteColleague2 *m_pColleague2;

};



int main() {

    ConcreteMediator *pcm = new ConcreteMediator();;

    ConcreteColleague1 *pc1 = new ConcreteColleague1(pcm);

    ConcreteColleague2 *pc2 = new ConcreteColleague2(pcm);



    pcm->setColleague1(pc1);

    pcm->setColleague2(pc2);



    pc1->send("message from pc1");

  delete pcm;
  delete pc1;
  delete pc2;
return 0; }

  中介者模式就是封装了多个类之间的交互,使得我们不需要直接在多个类之间手动弄交互。

  如下所示:

------------>

  但是这样就使得中介者变得复杂了,需要小心管理。

你可能感兴趣的:(media)