Przejdź do zawartości

Kody źródłowe/Stan (wzorzec projektowy)

Z Wikibooks, biblioteki wolnych podręczników.
Stan (wzorzec projektowy) • Kod źródłowy
Stan (wzorzec projektowy)
Kod źródłowy
Kody źródłowe programów stosujących wzorzec projektowy stanu
Wikipedia
Zobacz w Wikipedii hasło Stan


C++

[edytuj]

Interfejs 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;
 };