Wzorzec projektowy fasada - facade

Stronę tą wyświetlono już: 16 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:

  • dodać punkt do tablicy obiektów;
  • dodać koło do tablicy obiektów;
  • wypisać wszystkie obiekty;
  • wyświetlić dokument (z nagłówkiem);
  • wyjść z programu
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++

Listing 1
  1. #include <iostream>
  2. #include <vector>
  3. class iDrawing{
  4. public:
  5. virtual void draw() const = 0;
  6. };
  7. class Point : public iDrawing{
  8. protected:
  9. double x;
  10. double y;
  11. public:
  12. Point(double x, double y) : x(x), y(y){};
  13. Point(){
  14. std::cout<<"Give me X coordinate: ";
  15. std::cin>>x;
  16. std::cout<<"Give me Y coordinate: ";
  17. std::cin>>y;
  18. }
  19. inline double getX() const{
  20. return x;
  21. }
  22. inline double getY() const{
  23. return y;
  24. }
  25. virtual void draw() const {
  26. std::cout<<"Point: {"<<x<<", "<<y<<"}"<<std::endl;
  27. }
  28. };
  29. class Circle : public iDrawing{
  30. protected:
  31. Point center;
  32. double ray;
  33. public:
  34. Circle(double x, double y, double ray) : center(x, y), ray(ray){};
  35. Circle() : center(){
  36. std::cout<<"Give me ray: ";
  37. std::cin>>ray;
  38. }
  39. virtual void draw() const{
  40. std::cout<<"Circle: {xc="<<center.getX()<<", y="<<center.getY()<<", ray="<<ray<<"}"<<std::endl<<std::endl;
  41. }
  42. };
  43. enum drawingObjectType{
  44. point,
  45. circle
  46. };
  47. class DocumentHeader{
  48. protected:
  49. int width;
  50. int height;
  51. public:
  52. DocumentHeader(){
  53. std::cout<<"Create document header"<<std::endl<<std::endl;
  54. std::cout<<"Document width: ";
  55. std::cin>> width;
  56. std::cout<<"Document height: ";
  57. std::cin>> height;
  58. }
  59. void writeDocumentHeader() const {
  60. std::cout<<"Document header: {width="<<width<<", height="<<height<<"}"<<std::endl;
  61. }
  62. };
  63. class Facade{
  64. protected:
  65. std::vector<iDrawing*> drawingObjects;
  66. void addDravingObject(enum drawingObjectType dt){
  67. switch(dt){
  68. case drawingObjectType::point:
  69. drawingObjects.push_back(new Point());
  70. break;
  71. case drawingObjectType::circle:
  72. drawingObjects.push_back(new Circle());
  73. break;
  74. }
  75. }
  76. void writeObjects() {
  77. std::cout<<std::endl<<"List of created objects:"<<std::endl<<std::endl;
  78. for(std::vector<iDrawing*>::iterator drawingObject = drawingObjects.begin(); drawingObject < drawingObjects.end(); drawingObject++){
  79. (*drawingObject)->draw();
  80. std::cout<<std::endl;
  81. }
  82. }
  83. DocumentHeader header;
  84. void writeDocument(){
  85. header.writeDocumentHeader();
  86. writeObjects();
  87. }
  88. public:
  89. void menu(){
  90. int choose = 4;
  91. while(true){
  92. std::cout<<"Welcome in program made to create dravable objects. Please choose option:"<<std::endl<<std::endl;
  93. std::cout<<"Add point object [0]"<<std::endl;
  94. std::cout<<"Add circle object [1]"<<std::endl;
  95. std::cout<<"Write all objects [2]"<<std::endl;
  96. std::cout<<"Write document [3]"<<std::endl;
  97. std::cout<<"Exit program [4]"<<std::endl;
  98. std::cin>>choose;
  99. if(choose == 4)
  100. return ;
  101. if(choose == 2){
  102. writeObjects();
  103. }else if(choose > -1 && choose < 2){
  104. addDravingObject((drawingObjectType)choose);
  105. }else if(choose == 3){
  106. writeDocument();
  107. }else{
  108. std::cout<<"Bad choose!!! Try again!!!"<<std::endl<<std::endl;
  109. }
  110. }
  111. }
  112. };
  113. int main(){
  114. Facade sys;
  115. sys.menu();
  116. std::cin.get();
  117. return 0;
  118. }

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

Komentarze