IObserver
interface IObservable;
interface IObserver
{
virtual void update(IObservable *pObservable) = 0;
virtual void update(IObservable *pObservable) const = 0;
};
interface IObservable
{
typedef std::set<IObserver *> container_type;
typedef container_type::iterator iterator;
typedef container_type::const_iterator const_iterator;
virtual void notify() {
const_iterator it;
for (it = m_setObserver.begin(); it != m_setObserver.end(); ++it) {
(*it)->update(this);
}
}
void addObserver(IObserver *pObserver) { m_setObserver.insert(pObserver); }
void removeObserver(IObserver *pObserver) { m_setObserver.erase(pObserver); }
private:
container_type m_setObserver;
};
class A : public IObservable
{
public:
A () : m_int (0) {}
void setInt(int _int) {
if (_int == m_int) {
return;
}
m_int = _int;
notify();
}
int getInt() {
return m_int;
}
private:
int m_int;
};
class B : public IObserver
{
public:
virtual void update(IObservable *pObservable) {
A *pA = 0;
if (!Dynamic_Cast(pA, pObservable)) {
return;
}
cout << pA->getInt() << endl;
}
virtual void update(IObservable *pObservable) const {
A *pA = 0;
if (!Dynamic_Cast(pA, pObservable)) {
return;
}
cout << pA->getInt() << endl;
}
};
void _tmain()
{
A a;
B b1;
B b2;
a.addObserver(&b1);
a.addObserver(&b2);
a.setInt(1);
}