1 观察者:
#include "Watcher.h" Watcher::Watcher(string name) { this->name=name; } Watcher::Watcher(const Watcher &watcher)//必须实现拷贝构造函数,才能放到容器里 { this->name=watcher.name; } Watcher::~Watcher(void) { } string Watcher::getname() { return name; } void Watcher::update() { std::cout<<name+" is updated"<<endl; }
2 主题
#include "Watched.h" Watched::Watched(void) { } Watched::~Watched(void) { } void Watched::AddWatcher(Watcher *newone) { allwatchers.push_back(*newone); } void Watched::RemoveWatcher(Watcher *oldone) { for(int i=0;i<allwatchers.size();i++) { if(allwatchers[i].getname()==oldone->getname()) {allwatchers.erase( allwatchers.begin()+ i ); break;} } } void Watched::RemoveAllWatcher() { allwatchers.clear(); } void Watched::NotifyAllWatcher() { for(int i=0;i<allwatchers.size();i++) { allwatchers[i].update(); } }
3 main函数
// Observer.cpp : 定义控制台应用程序的入口点。 // #include "vld.h" #include "stdafx.h" #include "Watched.h" #include "Watcher.h" int _tmain(int argc, _TCHAR* argv[]) { Watcher* Watcher1=new Watcher("Watcher1"); Watcher* Watcher2=new Watcher("Watcher2"); Watcher* Watcher3=new Watcher("Watcher3"); Watched* watched=new Watched(); watched->AddWatcher(Watcher1); watched->AddWatcher(Watcher2); watched->AddWatcher(Watcher3); watched->NotifyAllWatcher(); getchar(); delete watched; delete Watcher1; delete Watcher2; delete Watcher3; return 0; }
4 运行效果