以前からずっと疑問なんだけれど, passive な Observer パタンつーか,監視されているクラス(oservee)のオブジェクトが変化しうる Proxy パタンつーか,そういうので更新の可否をカウンタで示すつーのはアリなんかにゃ〜?
class Observee { public: void updateData() { // 状態を変更 ++state_count_; } double getData() const { double result; // 超ヘビーな計算 return result; } boost::int64_t getStateCount() const { return state_count_; } private: boost::int64_t state_count_; // その他もろもろの実装 }; class PassiveObserver // いわゆる Proxy { public: double getData() const { if( p_observee_->getStateCount() != prev_state_count_ ){ data_cache_ = p_observee_->getData(); prev_state_count_ = getStateCount(); } return data_cache_; } private: Observee const *p_observee_; boost::int64_t prev_state_count_; double data_cache_; };
つーか 対象の状態が変化しうる Passive Observer でこれ以外の実装方法ってちょっと思いつかないんだけれど,ど〜なんだろ?もちろん, Active Observer (ふつーの Observer パタン)にするっつーのはあるけれど,基本的に passive にできるなら passive にしたいしにゃ〜(passive だと observer から observee への完全に1方向の依存関係で済むのに対して, active の場合 observee から observer への依存関係も(更新の notification のために)導入されて,相互依存関係になるため).
#しかし, passive/active ちぅ言葉遣いは紛らわしいにゃ. Observer の立場において更新の notification をどう検知するかという観点の言葉だと「Passive Observer (Proxy) は "active"」で「Active Observer (Observer) は "passive"」なんだよにゃ〜. passive/active なんてマイナーな言葉遣いやめて,おとなしく Proxy/Observer で統一しようかな…….
#書いてて思い出した. boost::shared_ptr + boost::weak_ptr による典型的なキャッシュコレクションパタンの場合とどう違ってくるんだ?
#ダメだ.眠いから頭回ってない.寝る.
#あれ? boost::shared_ptr + boost::weak_ptr の場合,そもそも指してる先ってあれ生成されたおぶ
#ねる