作者:默默地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); }
时间: 2024-11-08 12:49:38