[设计模式]<9>. C++与观察者模式(observer pattern)

作者:默默地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);


}

 

 

posted @ 2016-11-22 23:38  默默地EEer  阅读(863)  评论(0编辑  收藏  举报