观察者模式

原创 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
  • 22MB
  • 下载

OC学习日记012(一)通知——观察者模式的另一种形式

注意:我们随着学习的深入,在对KVC和KVO以及通知的学习中,我们发现原来简单的命令行的程序已经不能直观的反映我们学习的问题了,而且为了对后面UI的学习,我们可以新建IOS工程里面的Single Vi...

Android基于观察者模式下载管理

  • 2017年11月08日 11:45
  • 459KB
  • 下载

Java的观察者模式

  • 2015年12月29日 21:59
  • 10KB
  • 下载

Android用观察者模式代替广播通知刷新界面

 源码下载我们知道广播是夸进程的,所以不能什么时候都用广播,如果涉及到安全问题就最好别用广播,怕其他应用进程监听到你的广播。这里采用接口去实现广播的功能。 下面看实现代码: 1.首先我定...

观察者模式练习

  • 2015年12月09日 20:35
  • 6KB
  • 下载

观察者模式框架2

  • 2017年08月11日 21:42
  • 48B
  • 下载

C# ~ 从 委托事件 到 观察者模式

委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分 ;参考 [1]. 从无到有 谈委托、事件和观察者模式; [2]. 初识事件 到 自定义事件; [3]. 从类型...
  • qing101
  • qing101
  • 2016年08月15日 19:00
  • 1457

观察者模式

  • 2013年03月07日 23:49
  • 17KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:观察者模式
举报原因:
原因补充:

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