Sto sperimentando il design pattern Observer seguendo le indicazioni riportate nel libro Design Patterns di Gamma, Helm, Johnson, Vlissides che qui riporto:
Per le classi base quindi niente problemi.codice:class Subject; class Observer { public: virtual ~Observer(){}; virtual void update(Subject*subject)=0; protected: Observer(){}; }; class Subject { public: virtual ~Subject(){}; virtual void attach(Observer*observer); virtual void detach(Observer*observer); virtual void notify(); protected: Subject(){}; private: std::vector<Observer*>mObserverList; };
Mi crea qualche problema / dubbio come implementare le classi derivate, in particolare di Observer.
In Observer infatti devo tenere il riferimento al / ai Subject che sto osservando.
Ho provato a fare cosi':
Il dubbio principale e' se nelle classi derivate da Observer tengo come riferimento un dato membro di tipo Subject o DerSubject, cioe' quello che sara' il reale tipo di subject osservato: credo la seconda, anche se nell'esempio di codice sopra postato ho fatto il contrario.codice:class DerSubject: public Subject {}; class ObserverTester: public Observer /*ObeserverTester deve tenere d'occhio un DerSubject, quindi al suo interno, e' meglio fare riferimento a un DerSubject o a un Subject?*/ { public: ObserverTester(Subject* subject)//o DerSubject? { mSubject=subject; mSubject->attach(this); }; void update(Subject* subject) override//qui resta cosi' per forza... { if(subject==mSubject) { std::cout<<"\nHello from observer "<<this; std::cout<<"\nI'm observing subject "<<mSubject; } }; private: Subject* mSubject;//o DerSubject? };
Inoltre, potrebbe mai essere necessario implementare un metodo setSubject nelle classi derivate da Observer per poter cambiare il Subject osservato?
Grazie