码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式--11种行为模式之一。

时间:2017-09-04 17:41:48      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:之一   函数   str   virtual   oid   back   iter   move   不同的   

主要思想:

  1个目标可以有多个观察者,

  当目标更新后,目标主动通知观察者,

  不同的观察者通过回调函数完成多态。

/*
观察者模式示例
*/
# include <iostream>
# include <list>

using namespace std;

//目标声明,观察者中用
class BaseSubject;

//抽象的观察者
class AbsObserver {
public:
        //更新目标,会传递目标指针,使观察者可以操作目标
        virtual void update(BaseSubject *obj) = 0;
};

//目标基类
class BaseSubject {
public:
        //添加观察者
        virtual void addObserver(AbsObserver *obs) {
                observers.push_back(obs);
        }
        //删除观察者
        virtual void delObserver(AbsObserver *obs) {
                observers.remove(obs);
        }
        //通知观察者
        virtual void notifyObserver() {
                for (list<AbsObserver *>::iterator ite = observers.begin(); ite != observers.end(); ++ite) {
                        (*ite)->update(this);
                }
        }
private:
        list<AbsObserver *> observers;
};

//具体的观察者1
class Observer1 : public AbsObserver {
public:
        virtual void update(BaseSubject *obj) {
                cout << "观察者1收到通知并进行操作" << endl;
        }
};

//具体的观察者2
class Observer2 : public AbsObserver {
public:
        virtual void update(BaseSubject *obj) {
                cout << "观察者2收到通知并进行操作" << endl;
        }
};


//目标派生类
class DeriveSubject : public BaseSubject {
public:
        DeriveSubject() {
                cout << "构造目标" << endl;
        }
};

int main()
{
        Observer1 obs1;         //构造观察者1
        Observer2 obs2;         //构造观察者2
        DeriveSubject a;        //构造目标
        a.addObserver(&obs1);   //添加观察者1
        a.addObserver(&obs2);   //添加观察者2
        a.notifyObserver();     //通知观察者
}

  

观察者模式--11种行为模式之一。

标签:之一   函数   str   virtual   oid   back   iter   move   不同的   

原文地址:http://www.cnblogs.com/vrg0/p/7474389.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!