Wzorzec projektowy stan - state

Autor podstrony: Krzysztof Zajączkowski

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

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
Propozycje książek