Autor podstrony: Krzysztof Zajączkowski

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

Opis wzorca projektowego stan

Wzorzec projektowy stan należy do wzorców czynnościowych. Celem tego wzorca jest zaimplementowanie w głównej klasie możliwości wyboru interfejsu, z którego klasa ta będzie korzystała. Taka implementacja może mieć miejsce np. przy wyborze trybu rysowania obiektów w programie graficznym.

Przykładowy diagram UML wzorca projektowego stan

Na poniższym diagramie UML klasa Drawing agreguje interfejs iDraw, za którym stoi jedna z dwóch klas:

  • DrawSquare - rysująvej prostokąt;
  • DrawCircle - rysującej okrąg (a przynajmniej coś co jako tako przypomina okrąg)

Klasa główna Drawing ma pole state, które można ustawić za pomocą metody setState decydując tym samym o wyborze obiektu stojącego za interfejsem iDraw oraz trybem rysowania.

Przykładowy diagram UML wzorca projektowego stan
Rys. 1
Przykładowy diagram UML dla wzorca projektowego stan

Przykład implementacji wzorca projektowego stan w C++

#include <iostream> class iDraw{ public: virtual void draw() = 0; }; class DrawSquare : public iDraw{ public: virtual void draw(){ std::cout << std::endl << "###" << std::endl; std::cout << "# #" << std::endl; std::cout << "###" << std::endl << std::endl; } }; class DrawCircle : public iDraw{ public: virtual void draw(){ std::cout << std::endl << " # " << std::endl; std::cout << "# #" << std::endl; std::cout << " # " << std::endl << std::endl; } }; class Drawing{ int state; iDraw* draw; void drawObject(){ if(draw){ draw->draw(); } } public: Drawing() : state(0), draw(NULL){} void setState(){ do{ std::cout << "Choose option: " << std::endl; std::cout << "Exit [0]" << std::endl; std::cout << "Square [1]" << std::endl; std::cout << "Circle [2]" << std::endl; std::cin >> state; if(draw){ delete draw; draw = NULL; } switch(state){ case 1: draw = new DrawSquare; break; case 2: draw = new DrawCircle; break; default: std::cout << "Try again" << std::endl; } drawObject(); }while(state != 0); } }; int main(){ Drawing drawing; drawing.setState(); std::cin.get(); return 0; }

Przykładowy wynik działania powyższego kodu:

Choose option:
Exit   [0]
Square [1]
Circle [2]
1

###
# #
###

Choose option:
Exit   [0]
Square [1]
Circle [2]
2

 #
# #
 #

Choose option:
Exit   [0]
Square [1]
Circle [2]
Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/observer - strona opisująca wzorzec projektowy stan [En]
  2. pl.wikipedia.org - opis tego wzorca na stronie Wikipedii
Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.