c++实现观察者模式

#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 = &num;
  observable->notifyObservers(p);

  cout << "-----------------------------n";
  return 0;
}