观察者模式

原创 2016年08月28日 18:46:39

定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,而观察者只需注册主题后,就可以获取通知,若不想继续观察主题,让主题在观察者列表中删掉对应观察者就好了。

适用场景:1.当两个交互模块需要松耦合时;

  2.当一个对象的状态发生改变,需要通知其它对象做成相应动作。

组成:

Subject:定义发送通知的接口,以及注册和删除观察者。

Observe:定义观察者接收到通知后的状态更新接口。

ConcreteSubject:

1.在一个列表中存储注册了的观察者;

2.当状态发送改变时,通知观察者

ConcreteObserve:

1.在内部维护一个指向ConcreteSubject的指针或引用

2.存储有关状态,这些状态与主题状态应该一致

3.实现Observe的更新接口,使自身状态与主题的状态一致。

类图:


代码:


#include <cstdio>
#include <stack>
#include <set>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <list>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <string>
#include <map>
#include <iomanip>
#include <cmath>
#include <time.h>
#define LL long long
using namespace std;

// 观察者,派生出具体观察者,实现当有通知时的动作
class observe
{
public:
        virtual void update()=0;
};

// 主题,当有状态变化时通知相关观察者。
class subject
{
public:
        virtual void registe(observe*)=0;
        virtual void remove(observe*)=0;
        virtual void notify()=0;
};

// 有新电影上映就发送通知
class cinema:public subject
{
private:
        list<observe*> objs;
        string newMovie;
public:
        void registe(observe *obj)
        {
                objs.push_back(obj);
        }
        void remove(observe *obj)
        {
                objs.remove(obj);
        }
        void notify()
        {
                for (auto it=objs.begin();it!=objs.end();it++)  {
                        (*it)->update();
                }
        }

        void haveNewMovie(string movie)
        {
                newMovie = movie;
                notify();
        }
        string getMovieName()
        {
                return newMovie;
        }
};

// student 接收到消息后的反应
class student:public observe
{
private:
        subject *sub;
public:
        student(subject *_sub):sub(_sub)
        {
                sub->registe(this);
        }
        void update()
        {
                cout<<"well, let us go to cinema and see "<< ((cinema*)sub)->getMovieName()<<endl;
        }
};

// teacher 接收到消息后的<span style="font-family: Arial, Helvetica, sans-serif;">反应</span>
class teacher:public observe
{
private:
        subject *sub;
public:
        teacher(subject *_sub):sub(_sub)
        {
                sub->registe(this);
        }
        void update()
        {
                cout<<"shit,those students will see "<< ((cinema*)sub)->getMovieName()<<endl;
        }
};


int main()
{
        cinema obs;
        student stu1(&obs);
        student stu2(&obs);
        teacher tea(&obs);

        obs.haveNewMovie("Harry Potter");
        obs.haveNewMovie("2012");

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

观察者模式for android demo

  • 2017-09-30 11:09
  • 22.00MB
  • 下载

Java的观察者模式

  • 2015-12-29 21:59
  • 10KB
  • 下载

观察者模式的c++代码实现

观察者模式--观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

观察者模式练习

观察者模式

观察者模式又称为发布订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够够自动更新自己.          ...

观察者模式框架2

观察者模式

  • 2013-03-07 23:49
  • 17KB
  • 下载

观察者模式

观察者的本质含义如下面图: 把上述行为抽像出来即是如下类图: 把上面类图以一下例子来实现。这个例子讲的是,一个气象站的公告电子牌,如果气象站的数据有更新,则各电子公告牌也应该更新,这时气像...

观察者模式

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)