Possibile implementazione di un Observer che osserva piu' di un Subject.
Chiedo, a chi vorra' darci un occhio, di porre particolare attenzione al metodo setSubject, io non trovo altre strade, se qualcuno ne ha di migliori...devo ancora approfondire quanto proposto da Shodan mediante std::set, che non conosco e devo studiare, ma non credo sia adatto se serve avere direttamente i tipi di Subject derivati e non il Subject generico (v. post precedenti).
Si accettano suggerimenti e/o modifiche.
codice:
class DerObserverMoreSubject: public Observer
{
public:
DerObserverMoreSubject(DerSubject1* subject1, DerSubject2* subject2, DerSubject3* subject3):
Observer(), mSubject1(subject1), mSubject2(subject2), mSubject3(subject3)
{
if(mSubject1)
{
mSubject1->attach(this);
}
if(mSubject2)
{
mSubject2->attach(this);
}
if(mSubject3)
{
mSubject3->attach(this);
}
};
~DerObserverMoreSubject()
{
if(mSubject1)
{
mSubject1->detach(this);
}
if(mSubject2)
{
mSubject2->detach(this);
}
if(mSubject3)
{
mSubject3->detach(this);
}
};
void setSubject(Subject* subject) override
{
bool found = false;
if(!found)
{
DerSubject1* temp = dynamic_cast<DerSubject1*>(subject);
if(temp)
{
mSubject1 = temp;
std::cout<<"\nOperazione andata a buon fine\n";
found = true;
}
}
if(!found)
{
DerSubject2* temp = dynamic_cast<DerSubject2*>(subject);
if(temp)
{
mSubject2 = temp;
std::cout<<"\nOperazione andata a buon fine\n";
found = true;
}
}
if(!found)
{
DerSubject3* temp = dynamic_cast<DerSubject3*>(subject);
if(temp)
{
mSubject3 = temp;
std::cout<<"\nOperazione andata a buon fine\n";
found = true;
}
}
if(!found)
{
std::cout<<"\nPassato un Subject di tipo diverso dall'atteso, l'operazione non e' andata a buon fine\n";
}
};
void update(Subject* subject) override
{
std::cout<<"\nHello from Observer "<<this<<" \n";
if(subject == mSubject1)
{
std::cout<<"\n"<<__func__<<" was called by mSubject1\n";
}
if(subject == mSubject2)
{
std::cout<<"\n"<<__func__<<" was called by mSubject2\n";
}
if(subject == mSubject3)
{
std::cout<<"\n"<<__func__<<" was called by mSubject3\n";
}
};
void removeSubject(Subject* subject) override
{
if(subject == mSubject1)
{
mSubject1 = nullptr;
}
if(subject == mSubject2)
{
mSubject2 = nullptr;
}
if(subject == mSubject3)
{
mSubject3 = nullptr;
}
};
private:
DerSubject1* mSubject1;
DerSubject2* mSubject2;
DerSubject3* mSubject3;
};