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
(続きます).