Observer


まず最初はObserverからやってみよう.


class observer {
public:
  virtual void update(subject* sub);
};


class subject {
  std::list<observer> list_;
public:
  void add(observer* obs);
  void remove(observer* obs);
  void notify();
};


class data : public subject {
public:
  void update_data(){
    // update data
    notify();
  }
};


class viewer : public observer {
public:
  void update(subject* sub);
};


data d;
viewer v;

d.add(v);

d.update_data(); // notify


これでうまく動くのかは分からないけど,こんな雰囲気でいいのかな.

#各メンバ関数の定義は書いてないです.


ただし,これだとObserver派生のvが削除された時にダングリング問題が発生してしまう.

(ダングリング問題って言葉あるのかな?).


そこでGoF本ではdataクラスでviewerクラスへのポインタを保持し,デストラクタでthisをremoveしている.


でもそれのせいで自分は理解がまだ追いついてなかったりw


(続きます).