Signal/SlotだとかObserverパターンなどと呼ばれる構造を提供する.
名のとおり観察するクラスと観察されるクラスに分けられる.
誤解しやすいのは観察するクラスがチェックするのではなく,観察されるクラスが変更を通知する.
例えばDoc-Viewアーキテクチャでは各Viewがデータを観察するわけであるが,常にViewが変更を確認するのは高コストである.
そこでDocumentが変更された時にDocumentが全てのViewに通知すればよい.
簡単な例とすると
誤解しやすいのは観察するクラスがチェックするのではなく,観察されるクラスが変更を通知する.
例えばDoc-Viewアーキテクチャでは各Viewがデータを観察するわけであるが,常にViewが変更を確認するのは高コストである.
そこでDocumentが変更された時にDocumentが全てのViewに通知すればよい.
簡単な例とすると
class Document { public: void SetData(std::string arg ) { mData = arg; for( auto it = mpViews.begin(); it != mpViews.end(); ++it) { it->lock()->Update(); } } void AddView(std::shared_ptr<View> view) { mpViews.push_back( std::weak_ptr<View>( view ) ); } private: std::vector< std::weak_ptr<View> > mpViews; std::string mData; }; class View { public: void Update() { UpdateInternal(); } protected: virtual UpdateInternal() = 0; };
リファレンス
基本的には,メンバ関数ポインタを渡しておくことで通知する構造となっている.
基本的には,メンバ関数ポインタを渡しておくことで通知する構造となっている.
コメントをかく