您的位置:首页 > 编程语言 > C语言/C++

C++实践::Template实现Observer模式

2004-07-05 08:32 483 查看
难度:





用C++ template实现的通用Observer代码。本文并无神秘之处,template只是运用在对状态信息类型的泛化。过多的细节就没必要不讲了,我想各位看官比我更明白吧 /* Design Pattern implementation with C++ template - Observer Author: Jinhao Data: 5/Jul/2004 */ #ifndef _OBSERVER_H_ #define _OBSERVER_H_ #include<vector> template[/b]<typename[/b] Msg> struct[/b] helper; template[/b]<typename[/b] Msg> struct[/b] subject; template[/b]<typename[/b] Msg> class[/b] observer { friend[/b] class[/b] helper<Msg>; protected[/b]: observer():psbj_(NULL) {} public[/b]: virtual[/b] ~observer() { if[/b](psbj_) psbj_->detach(*this[/b]); } virtual[/b] void[/b] update(const[/b] Msg&)=0; private[/b]: subject<Msg>* psbj_; }; template[/b]<typename[/b] Msg> class[/b] subject { friend[/b] class[/b] helper<Msg>; public[/b]: virtual[/b] ~subject() { typename[/b] std::vector<observer<Msg>*>::iterator begin = obsvrvec_.begin(); typename[/b] std::vector<observer<Msg>*>::iterator end = obsvrvec_.end(); for[/b](; begin!=end; ++begin) helper<Msg>::attachtosubject(NULL, *begin); } void[/b] attach(observer<Msg>& rhs) //register { obsvrvec_.push_back(&rhs); helper<Msg>::attachtosubject(this[/b], &rhs); } void[/b] detach(observer<Msg>& rhs) //unregister { typename[/b] std::vector<observer<Msg>*>::iterator matched = find(obsvrvec_.begin(), obsvrvec_.end(), &rhs); if[/b](matched != obsvrvec_.end()) obsvrvec_.erase(matched); } void[/b] notify() //notify all observers { typename[/b] std::vector<observer<Msg>*>::iterator begin = obsvrvec_.begin(); typename[/b] std::vector<observer<Msg>*>::iterator end = obsvrvec_.end(); for[/b](; begin!=end; ++begin) (*begin)->update(message_); } protected[/b]: Msg& message() { return message_; } const[/b] Msg& message() const[/b] { return[/b] message_; } void[/b] message(const[/b] Msg& rhs) { message_ = rhs; } private[/b]: Msg message_; std::vector<observer<Msg>*> obsvrvec_; }; template[/b]<typename[/b] Msg> struct[/b] helper { static[/b] void[/b] attachtosubject(subject<Msg>* sbj, observer<Msg>* obsv) { obsv->psbj_ = sbj; } }; #endif //_OBSERVER_H_ 下面是应用的示例代码 class[/b] ConcreteObserver1:public[/b] observer<string> { public[/b]: void[/b] update(const[/b] string& message) { cout<<message<<endl; } }; class[/b] ConcreteObserver2:public[/b] observer<string> { public[/b]: void[/b] update(const[/b] string& message) { copy(message.rbegin(), message.rend(), ostream_iterator<string::value_type>(cout)); cout<<endl; } }; class[/b] ConcreteSubject:public[/b] subject<string> { public[/b]: void[/b] set(const[/b] string& str) { message(str); } }; int[/b] main() { ConcreteSubject subject; ConcreteObserver1 o1; ConcreteObserver2 o2; subject.attach(o1); subject.attach(o2); subject.set("show me the money"); subject.notify(); }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: