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