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

观察者模式(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: