Wzorce projektowe (12)

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

Fasada.

Fasada to wzorzec obiektowy. Jego celem jest ujednolicenie dostępu do złożonego systemu, przez wystawienie uproszczonego uporządkowanego interfejsu programistycznego, który ułatwia jego użycie. To czy klient posiada bezpośredni dostęp do systemu zależy od programisty wzorca.

Klasy

/*klasy, które udostępniają różne funkcje, jednak klient chce korzystać tylko z wybranych*/
class SubSystem1{/*...*/};
class SubSystem2{/*...*/};
class SubSystem3{/*...*/};
class SubSystem4{/*...*/};

class Facade{/*
klasa zawiera obiekty i posiada metody, które udostępnia klientowi
*/};

class Client{/*
operując na Facade, posiada zebrane w jednym miejscu operacje skomplikowanego systemu, których potrzebuje
*/};

Etapy działania

  • Klient tworzy obiekt Facade i za jego pośrednictwem używa potrzebnych mu operacji systemu.

Konsekwencje

  • Duże zmniejszenie zależności miedzy klientem a złożonym systemem – jeśli klient nie korzysta bezpośrednio z żadnych elementów ukrytych za fasadą systemu, całość jest łatwiejsza w konserwacji i utrzymaniu.
  • Podział aplikacji na warstwy (fasady) co upraszcza i ujednolica komunikację.
  • Możliwość zablokowania klientowi drogi bezpośredniego korzystania ze złożonego systemu, jeśli jest to konieczne.
  • Kod klienta wykorzystujący fasadę jest czytelniejszy i łatwiejszy w zrozumieniu.

Przykład

#include <iostream>
using namespace std;

///kilka klas podsystemów, które zawierają inne klasy oraz maja wiele operacji

class SubSystem1 {
/*...
...*/
public:
    void Operacja11() { cout<<"Operacja 1 Systemu1"<<endl; }
    void Operacja12() { cout<<"Operacja 2 Systemu1"<<endl; }
    void Operacja13() { cout<<"Operacja 3 Systemu1"<<endl;  }
    void Operacja14() { cout<<"Operacja 4 Systemu1"<<endl;  }
    void Operacja15() { cout<<"Operacja 5 Systemu1"<<endl;  }
};

class SubSystem2 {
/*...
...*/
public:
    void Operacja21() { cout<<"Operacja 1 Systemu2"<<endl;  }
    void Operacja22() { cout<<"Operacja 2 Systemu2"<<endl;  }
    void Operacja23() { cout<<"Operacja 3 Systemu2"<<endl;  }
    void Operacja24() { cout<<"Operacja 4 Systemu2"<<endl;  }
    void Operacja25() { cout<<"Operacja 5 Systemu2"<<endl;  }
};
class SubSystem3 {
/*...
...*/
public:
    void Operacja31() { cout<<"Operacja 1 Systemu3"<<endl;  }
    void Operacja32() { cout<<"Operacja 2 Systemu3"<<endl; }
    void Operacja33() { cout<<"Operacja 3 Systemu3"<<endl; }
    void Operacja34() { cout<<"Operacja 4 Systemu3"<<endl; }
    void Operacja35() { cout<<"Operacja 5 Systemu3"<<endl; }
};


///klasa Fasady, która posiada tylko uproszczoną wersję systemu
class Fasada {
public:
    Fasada() : ss1( new SubSystem1() ),
        ss2( new SubSystem2() ),
        ss3( new SubSystem3() )
    {
    }

    ~Fasada()
    {
        delete ss1;
        delete ss2;
        delete ss3;
    }

    void pierwszaOperacja() { ss1->Operacja11(); }
    void drugaOperacja() { ss2->Operacja21(); }
    void trzeciaOperacja() { ss3->Operacja34(); }

private:
    SubSystem1 *ss1;
    SubSystem2 *ss2;
    SubSystem3 *ss3;
};

int main(int argc, const char* argv[])
{
    Fasada facade;

    facade.pierwszaOperacja();
    facade.drugaOperacja();
    facade.trzeciaOperacja();

    return 0;
}

część 13

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.