Wzorzec projektowy fasada - facade

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 4606 razy

Opis wzorca projektowego fasada

Wzorzec projektowy fasada należy do wzorców strukturalnych. W tym wzorcu jedna klasa nadrzędna zawiera mniejsze obiekty klas, którymi zarządza udostępniając użytkownikowi (programowi) zewnętrznemu odpowiednie metody upraszczające obsługę działań na obiektach weń znajdujących się.

Przykład diagramu UML wzorca projektowego fasada

Na poniższym diagramie UML klasa Facade zarządza weń zawartymi interfejsami iDrawing obiektów klas Point i Circle. Interfejsy te przechowywane są w tablicy dynamicznej drawingObject. Klasa Facade zarządza również obiektem klasy DocumentHeader zawierającym nagłówek dokumentu.

Ostatecznie zewnętrzy użytkownik (program) korzysta z udostępnionej metody menu, dzięki której użytkownik może wybrać co chce wykonać. A może on:

Przykład diagramu UML wzorca projektowego fasada
Rys. 1
Przykład diagramu UML wzorca projektowego fasada

Przykład implementacji wzorca projektowego fasada w języku C++

#include <iostream> #include <vector> class iDrawing{ public: virtual void draw() const = 0; }; class Point : public iDrawing{ protected: double x; double y; public: Point(double x, double y) : x(x), y(y){}; Point(){ std::cout<<"Give me X coordinate: "; std::cin>>x; std::cout<<"Give me Y coordinate: "; std::cin>>y; } inline double getX() const{ return x; } inline double getY() const{ return y; } virtual void draw() const { std::cout<<"Point: {"<<x<<", "<<y<<"}"<<std::endl; } }; class Circle : public iDrawing{ protected: Point center; double ray; public: Circle(double x, double y, double ray) : center(x, y), ray(ray){}; Circle() : center(){ std::cout<<"Give me ray: "; std::cin>>ray; } virtual void draw() const{ std::cout<<"Circle: {xc="<<center.getX()<<", y="<<center.getY()<<", ray="<<ray<<"}"<<std::endl<<std::endl; } }; enum drawingObjectType{ point, circle }; class DocumentHeader{ protected: int width; int height; public: DocumentHeader(){ std::cout<<"Create document header"<<std::endl<<std::endl; std::cout<<"Document width: "; std::cin>> width; std::cout<<"Document height: "; std::cin>> height; } void writeDocumentHeader() const { std::cout<<"Document header: {width="<<width<<", height="<<height<<"}"<<std::endl; } }; class Facade{ protected: std::vector<iDrawing*> drawingObjects; void addDravingObject(enum drawingObjectType dt){ switch(dt){ case drawingObjectType::point: drawingObjects.push_back(new Point()); break; case drawingObjectType::circle: drawingObjects.push_back(new Circle()); break; } } void writeObjects() { std::cout<<std::endl<<"List of created objects:"<<std::endl<<std::endl; for(std::vector<iDrawing*>::iterator drawingObject = drawingObjects.begin(); drawingObject < drawingObjects.end(); drawingObject++){ (*drawingObject)->draw(); std::cout<<std::endl; } } DocumentHeader header; void writeDocument(){ header.writeDocumentHeader(); writeObjects(); } public: void menu(){ int choose = 4; while(true){ std::cout<<"Welcome in program made to create dravable objects. Please choose option:"<<std::endl<<std::endl; std::cout<<"Add point object [0]"<<std::endl; std::cout<<"Add circle object [1]"<<std::endl; std::cout<<"Write all objects [2]"<<std::endl; std::cout<<"Write document [3]"<<std::endl; std::cout<<"Exit program [4]"<<std::endl; std::cin>>choose; if(choose == 4) return ; if(choose == 2){ writeObjects(); }else if(choose > -1 && choose < 2){ addDravingObject((drawingObjectType)choose); }else if(choose == 3){ writeDocument(); }else{ std::cout<<"Bad choose!!! Try again!!!"<<std::endl<<std::endl; } } } }; int main(){ Facade sys; sys.menu(); std::cin.get(); return 0; }

Przykładowy wynik działania programu:

Create document header

Document width: 100
Document height: 200
Welcome in program made to create dravable objects. Please choose option:

Add point object [0]
Add circle object [1]
Write all objects [2]
Write document [3]
Exit program [4]
0
Give me X coordinate: 100
Give me Y coordinate: 200
Welcome in program made to create dravable objects. Please choose option:

Add point object [0]
Add circle object [1]
Write all objects [2]
Write document [3]
Exit program [4]
1
Give me X coordinate: 23
Give me Y coordinate: 34
Give me ray: 56
Welcome in program made to create dravable objects. Please choose option:

Add point object [0]
Add circle object [1]
Write all objects [2]
Write document [3]
Exit program [4]
2

List of created objects:

Point: {100, 200}

Circle: {xc=23, y=34, ray=56}


Welcome in program made to create dravable objects. Please choose option:

Add point object [0]
Add circle object [1]
Write all objects [2]
Write document [3]
Exit program [4]
3
Document header: {width=100, height=200}

List of created objects:

Point: {100, 200}

Circle: {xc=23, y=34, ray=56}


Welcome in program made to create dravable objects. Please choose option:

Add point object [0]
Add circle object [1]
Write all objects [2]
Write document [3]
Exit program [4]
Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/facade - strona opisująca wzorzec projektowy fasada [En]
  2. pl.wikipedia.org - opis tego wzorca na stronie Wikipedii
Propozycje książek
tytuł: C++. Projektowanie oprogramowania. Zasady i wzorce projektowe autor: Klaus Iglberger

Tytuł:

C++. Projektowanie oprogramowania. Zasady i wzorce projektowe

Autor:

Klaus Iglberger

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III autor: Carlos Santana Roldán

Tytuł:

React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III

Autor:

Carlos Santana Roldán

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku autor: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Tytuł:

Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku

Autor:

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

tytuł: Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III autor: Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

Tytuł:

Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III

Autor:

Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

tytuł: Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych autor: Bilgin Ibryam,  Roland Huß

Tytuł:

Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych

Autor:

Bilgin Ibryam, Roland Huß

tytuł: Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II autor: Alan Shalloway, James R. Trott

Tytuł:

Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II

Autor:

Alan Shalloway, James R. Trott

W związku z tym, że firma Helion nie wywiązuje się z swoich zobowiązań naliczania prowizji za każdą zakupioną książkę a kontakt z ową frmą jest nie możliwy autor strony zmuszony został do zablokowania linkowania książek. Za wszelkie niedogodności z tym związane z góry przepraszam i obiecuję włączenie linkowania gdy tylko sprawa zostanie wyjaśniona