Wzorce projektowe (17)

Autor: Damian Chodorek • Opublikowany: 24 lipca 2015 • Kategoria: kursy, wzorce projektowe

Mediator.

Mediator to wzorzec obiektowy. Zapewnia jednolity interfejs dla różnych elementów danego systemu. Innymi słowy jeśli istnieje wiele obiektów klas, które muszą się komunikować ze sobą, to zamiast tego, aby wszyscy znali wszystkich, wszyscy znają mediatora. Ten z kolei zna wszystkich.

Klasy

class Mediator{/*
implementuje metody komunikacyjne, posiada wskaźniki do wszystkich obiektów, które mogą się ze sobą komunikować
*/};

class ColleagueClasses{/*
posiadają referencję do swojego mediatora, komunikują się z nim zamiast bezpośrednio z innymi obiektami
*/};

Etapy działania

  1. Klient tworzy obiekty współpracujące ze sobą.
  2. Tworzy mediatora i przekazuje mu referencje obiektów oraz przekazuje obiektom referencje do mediatora.
  3. Obiekty wywołują odpowiednie metody, które tak naprawdę wywołują metody mediatora, który z kolei wykonuje pośrednią komunikację.

Konsekwencje

Zalety:

  • zmniejsza liczbę powiązań miedzy różnymi klasami,
  • klasy nie muszą nic wiedzieć poza tym, aby komunikować się z mediatorem,

Wady:

  • w dużych projektach mediatory stają się bardzo złożone i skomplikowane.

Przykład

#include <iostream>
#include <string>

using namespace std;

class KlasaA;
class KlasaB;

class Mediator
{
  private:
        KlasaA *_kA;
        KlasaB *_kB;
  public:
        Mediator(KlasaA *kA, KlasaB *kB):_kA(kA), _kB(kB) {}
        void klasaAOdB(KlasaA *sender) { cout<<"klasa A"
                <<" chce czegos od klasy B"<<endl; }
        void klasaBOdA(KlasaB *sender) { cout<<"klasa B"
                <<" chce czegosod klasy A"<<endl; }
};

class KlasaA
{
  private:
    Mediator *_m;
  public:
    void setMediator(Mediator *m){ _m=m;}
    KlasaA(){}
     void chciejCzegosOdB()
    {
      _m->klasaAOdB(this);
    }

};
class KlasaB
{
  private:
    Mediator *_m;
  public:
    void setMediator(Mediator *m){ _m=m;}
    KlasaB(){}
    void chciejCzegosOdA()
    {
      _m->klasaBOdA(this);
    }

};


int main(int argc, const char* argv[])
{
  KlasaA objA;
  KlasaB objB;

  Mediator m(&objA, &objB);

  objA.setMediator(&m);
  objB.setMediator(&m);

  objA.chciejCzegosOdB();
}

część 18

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.