Kody źródłowe/Stan (wzorzec projektowy)
C++
edytujInterfejs aplikacji rysującej wygląda następująco:
class AbstractTool {
public:
virtual void MoveTo(const Point& inP) = 0;
virtual void MouseDown(const Point& inP) = 0;
virtual void MouseUp(const Point& inP) = 0;
};
Przykładowym narzędziem może być:
class PenTool : public AbstractTool {
public:
PenTool() : mMouseIsDown(false) {}
virtual void MoveTo(const Point& inP) {
if(mMouseIsDown) {
DrawLine(mLastP, inP);
}
mLastP = inP;
}
virtual void MouseDown(const Point& inP) {
mMouseIsDown = true;
mLastP = inP;
}
virtual void MouseUp(const Point& inP) {
mMouseIsDown = false;
}
private:
bool mMouseIsDown;
Point mLastP;
};
class SelectionTool : public AbstractTool {
public:
SelectionTool() : mMouseIsDown(false) {}
virtual void MoveTo(const Point& inP) {
if(mMouseIsDown) {
mSelection.Set(mLastP, inP);
}
}
virtual void MouseDown(const Point& inP) {
mMouseIsDown = true;
mLastP = inP;
mSelection.Set(mLastP, inP);
}
virtual void MouseUp(const Point& inP) {
mMouseIsDown = false;
}
private:
bool mMouseIsDown;
Point mLastP;
Rectangle mSelection;
};
Kod klienta wykorzystującego wzorzec może wyglądać następująco:
class DrawingController {
public:
DrawingController() { selectPenTool(); } // Start with some tool.
void MoveTo(const Point& inP) {currentTool->MoveTo(inP); }
void MouseDown(const Point& inP) {currentTool->MouseDown(inP); }
void MouseUp(const Point& inP) {currentTool->MouseUp(inP); }
void selectPenTool() {
currentTool.reset(new PenTool);
}
void selectSelectionTool() {
currentTool.reset(new SelectionTool);
}
private:
std::auto_ptr<AbstractTool> currentTool;
};