观察者模式(observer)c++实现
2015-08-02 18:15
281 查看
1意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。2别名
依赖(Dependents), 发布-订阅(Publish-Subscribe)3动机
将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了他们的可重用性。4实用性
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使他们可以各自独立的改变和复用。2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象待改变。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
5结构
#include "subject.h" #include<iostream> #include <iterator> using std::iterator; void subject::attach(ObserverTrafficSignal* ob) { if(NULL != ob) _observers.push_back(ob); } void subject::detach(ObserverTrafficSignal* ob) { if(NULL != ob) _observers.remove(ob); } void TrafficSignal::notify() { if(!_countTime) { _countTime = rand()%5 + 4; ; if(_signal == RedSignal) _signal = GreenSignal; else _signal = RedSignal; } _countTime--; gotoxy(30, 4); if(_signal == RedSignal) std::cout<<"--红灯--"; else std::cout<<"--绿色--"; list<ObserverTrafficSignal* >::iterator iter = _observers.begin(); for(iter; iter != _observers.end(); iter++) { (*iter)->updataSignal(_signal); } }
subject.cpp
代码中notify函数通过随即一个数_countTime的简单的模拟了红绿灯(只有红灯和绿灯),每一次运行将_countTime减一,当_countTime等于零时再次随即一个数,并更好红绿灯。
5、main.cpp中的代码如下:
#include <iostream> using namespace std; #include <time.h> #include "subject.h" int main() { srand(time(0)); Vehicle ve1(80, 5); ve1.setmovestep(-3, 0); Vehicle ve2(80, 12); ve2.setmovestep(-4, 0); Vehicle ve3(80, 20); ve3.setmovestep(-2, 0); TrafficSignal tra; tra.attach(&ve1); //tra.attach(&ve2); tra.attach(&ve3); while(1) { ve1.drawVehicle(); ve2.drawVehicle(); ve3.drawVehicle(); _sleep(200); ve1.clearVehicle(); ve2.clearVehicle(); ve3.clearVehicle(); ve1.updataposition(); ve2.updataposition(); ve3.updataposition(); tra.notify(); } return 0; }
相关文章推荐
- LeetCode 209. Minimum Size Subarray Sum (O(n)实现)
- 链表实现链式栈 c语言
- 如何在C++中实现java final标识的类的功能
- 安迪的第一个字典
- C语言——单线程播放多音乐和一些小方法
- c++学习笔记(部分语法及c++11新特性)
- C语言:通过指针对数组元素进行排序
- Where is the Marble?
- c++ enum类型常量
- C语言编程入门——指针与函数、数组
- C语言编程入门——指针(下)
- cpp整理学习笔记 文件I/O:随机存取fseek()和ftell()
- C++函数
- C++ 常见面试题目 (二)
- C语言编程入门——指针(上)
- C++对象模型——Data 语意学(第三章)
- C语言:通过返回指针的形式找出数组的最大值和最小值
- [C++] 分享国外程序员的 C++开发资源大全
- C语言:链队列
- C语言编程入门——函数(下)