标签:htm using date 接受 程序 alt pre 没有 串口
作者:默默地EEer
原文:http://www.cnblogs.com/hebaichuanyeah/p/6091694.html
意图: 定义对象间一对多的依赖关系,使得一个对象被改变,其他对象被更新。
java的事件机制就是一个观察者模式,当事件发生,所有的事件接收者执行事件响应函数。
实现观察者模式,首先需要定义一个"观察者类(observer)"接口,在该类里面定义一个纯虚的事件响应函数。
并且需要一个"目标类(subject)",该类里面包含一个Set/Map或者List容器。当某个继承自"观察者类(observer)"的对象需要监听事件时,则把它添加到"目标类(subject)"对象的容器里面,当事件发生时,则遍历容器,调用事件响应函数。之前有一次我需要在Qt中实现一个串口事件触发的机制,我所用的Qt4中并没有串口事件,所以我在一个线程里阻塞等待串口,并试图使用观察者模式来实现这个自定义事件机制。后来蛋疼的发现,在Qt如果在非main线程里面操作UI类会时不时把程序跑死……
所以,如果你使用的语言/类库里面有完善的事件机制,观察者模式就用不到了。例如C#里面的委托配合泛型使用,等同于观察者模式的效果。
一个栗子
#include <iostream>
#include <set>
using namespace std;
//观察者接口,包括事件响应函数
class Observer
{
public :
virtual void update(int n)=0;
};
//目标类,负责触发事件
class Subject
{
public:
Subject(){};
//添加事件监听
void addObserver(Observer *observer)
{
observerSet.insert(observer);
}
//删除事件监听
void removeObserver(Observer *observer)
{
observerSet.erase(observer);
}
//触发事件
void notify(int n)
{
set<Observer *>::iterator iter;
for(iter = observerSet.begin() ; iter != observerSet.end() ; ++iter)
{
(*iter)->update(n);
// iter. ->update();
}
}
private:
set<Observer *> observerSet;
};
class Observer1 :public Observer
{
public:
void update(int n)
{
cout<<"观察者1事件响应函数,接受参数:"<<n<<endl;
}
};
class Observer2 :public Observer
{
public:
void update(int n)
{
cout<<"观察者2事件响应函数,接受参数:"<<n<<endl;
}
};
main()
{
Subject subject;
Observer * observer1 = new Observer1();
Observer * observer2 = new Observer2();
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notify(4);
subject.notify(1);
}

[设计模式]<9>. C++与观察者模式(observer pattern)
标签:htm using date 接受 程序 alt pre 没有 串口
原文地址:http://www.cnblogs.com/hebaichuanyeah/p/6091694.html