
#include <assert.h>
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
class Observable;
class Observer
{
public:
Observer() {}
virtual void update(Observable *observable, void *arg) = 0;
private:
Observer(const Observer &observer);
Observer &operator=(const Observer &observer);
};
class Observable
{
public:
virtual ~Observable()
{
delete instance;
}
void addObserver(Observer *observer);
void notifyObservers();
void notifyObservers(void *arg);
void setChanged(bool changed);
static Observable *getInstance();
private:
Observable();
protected:
void setUnChanged(bool unChanged);
private:
static Observable *instance;
bool changed;
set<Observer *> observers;
};
Observable::Observable()
{
this->changed = false;
}
void Observable::addObserver(Observer *observer)
{
assert(observer);
this->observers.insert(observer);
}
void Observable::setChanged(bool changed)
{
this->changed = changed;
}
void Observable::setUnChanged(bool unChanged)
{
this->changed = unChanged;
}
void Observable::notifyObservers()
{
notifyObservers(NULL);
}
void Observable::notifyObservers(void *arg)
{
if (!changed)
return;
this->setUnChanged(!this->changed);
set<Observer *>::iterator it;
for (it = this->observers.begin(); it != this->observers.end(); it++)
{
Observer *obs = *it;
obs->update(this, arg);
}
}
Observable *Observable::instance = new Observable();
Observable *Observable::getInstance()
{
return Observable::instance;
}
class AObserver : public Observer
{
public:
void update(Observable *observable, void *arg)
{
printf("AObserver:: %d n", *((int *)arg));
}
};
class BObserver : public Observer
{
public:
void update(Observable *observable, void *arg)
{
printf("BObserver:: %d n", *((int *)arg));
}
};
int main(int argc, char const *argv[])
{
cout << "-----------------------------n";
Observable *observable = Observable::getInstance();
observable->setChanged(true);
AObserver *a = new AObserver();
BObserver *b = new BObserver();
observable->addObserver(a);
observable->addObserver(b);
int num = 2;
int *p = #
observable->notifyObservers(p);
cout << "-----------------------------n";
return 0;
}
近期评论