zoukankan      html  css  js  c++  java
  • [设计模式]<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);
    
    
    }
    

  • 相关阅读:
    WebStorm 常用功能的使用技巧分享
    Android开发-之数据的存储方式一
    C#泛型方法解析
    Vuex2.0+Vue2.0构建备忘录应用实践
    Android Studio快速开发之道
    深入jQuery中的data()
    Django---->模板层(template)
    初识DJango——MTV模型
    初识DJango——Web框架
    Offcanvas 自适应窗口示例
  • 原文地址:https://www.cnblogs.com/hebaichuanyeah/p/6091694.html
Copyright © 2011-2022 走看看