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

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

2005-11-25 11:11 513 查看
用C++ template实现的通用Observer代码。本文并无神秘之处,template只是运用在对状态信息类型的泛化。过多的细节就没必要不讲了,我想各位看官比我更明白吧/*
Design Pattern implementation with C++ template - Observer
*/
#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();}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: