Wzorzec projektowy stan - state

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

Listing 1
  1. #include <iostream>
  2. class iDraw{
  3. public:
  4. virtual void draw() = 0;
  5. };
  6. class DrawSquare : public iDraw{
  7. public:
  8. virtual void draw(){
  9. std::cout << std::endl << "###" << std::endl;
  10. std::cout << "# #" << std::endl;
  11. std::cout << "###" << std::endl << std::endl;
  12. }
  13. };
  14. class DrawCircle : public iDraw{
  15. public:
  16. virtual void draw(){
  17. std::cout << std::endl << " # " << std::endl;
  18. std::cout << "# #" << std::endl;
  19. std::cout << " # " << std::endl << std::endl;
  20. }
  21. };
  22. class Drawing{
  23. int state;
  24. iDraw* draw;
  25. void drawObject(){
  26. if(draw){
  27. draw->draw();
  28. }
  29. }
  30. public:
  31. Drawing() : state(0), draw(NULL){}
  32. void setState(){
  33. do{
  34. std::cout << "Choose option: " << std::endl;
  35. std::cout << "Exit [0]" << std::endl;
  36. std::cout << "Square [1]" << std::endl;
  37. std::cout << "Circle [2]" << std::endl;
  38. std::cin >> state;
  39. if(draw){
  40. delete draw;
  41. draw = NULL;
  42. }
  43. switch(state){
  44. case 1:
  45. draw = new DrawSquare;
  46. break;
  47. case 2:
  48. draw = new DrawCircle;
  49. break;
  50. default:
  51. std::cout << "Try again" << std::endl;
  52. }
  53. drawObject();
  54. }while(state != 0);
  55. }
  56. };
  57. int main(){
  58. Drawing drawing;
  59. drawing.setState();
  60. std::cin.get();
  61. return 0;
  62. }

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

Komentarze