c++ 设计模式之 观察者模式
来源:互联网 发布:何老师都哭了知乎 编辑:程序博客网 时间:2024/06/08 09:12
概念
观察者模式的目的是在对象之间的定义一对多的依赖关系当一个对象改状态时,所有依赖关系的对象全部收到通知并自动更新.
类图
示例代码
#include <iostream>#include <vector>#include <time.h>#include <sys/types.h>#include <sys/timeb.h>#include <string.h> using namespace std ; class Subject; class Observer{public: Observer(){}; ~Observer(){}; virtualvoid Update(Subject* theChangeSubject) = 0;}; class Subject{public: Subject(){}; virtual~Subject() {}; virtualvoid Attach(Observer*); virtualvoid Detach(Observer*); virtualvoid Notify(); private: vector<Observer*>_observers;}; void Subject::Attach (Observer* o){ _observers.push_back(o);} void Subject::Detach (Observer* o){ intcount = _observers.size(); inti; for(i = 0; i < count; i++) { if(_observers[i]== o) break; } if(i< count) _observers.erase(_observers.begin()+ i); } void Subject::Notify (){ intcount = _observers.size(); for(int i = 0; i < count; i++) (_observers[i])->Update(this);} class ClockTimer : public Subject{public: ClockTimer(){ _strtime( tmpbuf ); }; intGetHour(); intGetMinute(); intGetSecond(); voidTick(); private: chartmpbuf[128];}; /* Set time zone from TZ environmentvariable. If TZ is not set,* the operating system is queried to obtainthe default value* for the variable.*/void ClockTimer::Tick(){ _tzset(); //Obtain operating system-style time. _strtime(tmpbuf ); Notify();} int ClockTimer::GetHour(){ chartimebuf[128]; strncpy(timebuf,tmpbuf, 2); timebuf[2]= NULL; returnatoi(timebuf);} int ClockTimer::GetMinute(){ chartimebuf[128]; strncpy(timebuf,tmpbuf+3, 2); timebuf[2]= NULL; returnatoi(timebuf);} int ClockTimer::GetSecond(){ chartimebuf[128]; strncpy(timebuf,tmpbuf+6, 2); timebuf[2]= NULL; returnatoi(timebuf);} class DigitalClock: public Observer{public: DigitalClock(ClockTimer*); ~DigitalClock(); voidUpdate(Subject *); voidDraw(); private: ClockTimer*_subject; }; DigitalClock::DigitalClock (ClockTimer *s){ _subject= s; _subject->Attach(this);} DigitalClock::~DigitalClock (){ _subject->Detach(this);} void DigitalClock::Update (Subject*theChangedSubject){ if(theChangedSubject== _subject) Draw();} void DigitalClock::Draw (){ inthour = _subject->GetHour(); intminute = _subject->GetMinute(); intsecond = _subject->GetSecond(); cout<< "Digital time is " << hour << ":" <<minute << ":" <<second << endl; } class AnalogClock: public Observer{public: AnalogClock(ClockTimer*); ~AnalogClock(); voidUpdate(Subject *); voidDraw(); private: ClockTimer*_subject; }; AnalogClock::AnalogClock (ClockTimer *s){ _subject= s; _subject->Attach(this);} AnalogClock::~AnalogClock (){ _subject->Detach(this);} void AnalogClock::Update (Subject*theChangedSubject){ if(theChangedSubject== _subject) Draw();} void AnalogClock::Draw (){ inthour = _subject->GetHour(); intminute = _subject->GetMinute(); intsecond = _subject->GetSecond(); cout<< "Analog time is " << hour << ":" <<minute << ":" <<second << endl;} int main(void){ ClockTimertimer; DigitalClockdigitalClock(&timer); AnalogClockanalogClock(&timer); timer.Tick(); return0;}
- 设计模式之观察者模式(C++)
- 设计模式之观察者模式(c++)
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- OpenFlow – 打造弹性化的可控互联网
- 黑马程序员--SQL Server Truncate关键字
- dp 专题系列(一)(UVa 10635,UVa 11825,UVa 10859,Uva LiveArchive 3882 )
- No 143 · 六道面试硅谷工程师的变态题目
- Open vSwitch – 开放虚拟交换标准
- c++ 设计模式之 观察者模式
- Android屏幕适配
- Mininet – “懒惰”网络研究者的福音
- DirectX游戏编程入门——第二部分(游戏编程工具箱) ——打印文本
- android camera(4)
- 转: 多重继承和void*的糗事
- NOX – 现代网络操作系统
- OpenStack – 开源云计算项目
- apue中int sigsuspend(const sigset_t *sigmask)的深入理解