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(); }
用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(); }
相关文章推荐
- C++实践::Template实现Observer模式
- C++实践::Template实现Observer模式
- HeadFirst设计模式 之 C++实现(二):Observer(观察者模式)
- [GoF设计模式]Bridge模式和Template模式的C++实现
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- Observer模式Linux下的C++实现
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern) (转)
- C++ 实现观察者(Observer)模式详解
- Head First设计模式C++实现--第九章:迭代器(Template)模式
- Head First 设计模式 (二) 观察者模式(observer pattern) C++实现
- C++实现Behavioral - Observer模式
- C++实现观察者(Observer)模式
- HeadFirst设计模式 之 C++实现(二):Observer(观察者模式)
- 设计模式之观察者(Observer)模式与其C++通用实现(上)
- 行为模式之模板方法模式(Template Pattern)C++实现
- 设计模式之观察者(Observer)模式与其C++通用实现(中)
- [GoF设计模式]Decorator模式和Observer模式的C++实现
- 设计模式之观察者(Observer)模式与其C++通用实现(下)
- 学习实践:使用模式,原则实现一个C++自动化测试程序
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)