观察者模式的定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
大白话:
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
2、这个模式的结构图
3、可以看到,该模式包含四个角色
抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
4、使用场景例子
有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。
c++
抽象被观察者 主题类:
.h:
#include "Observe.h"
#ifndef BEIOBSERVE_H_
#define BEIOBSERVE_H_
class observerable{
public:
virtual void registerObserve(Observe o){};
virtual void removeObserve(Observe o){};
virtual void notifyObserve(){};
};
#endif /* BEIOBSERVE_H_ */
抽象观察者:
.h
#include#includeusing namespace std;
#ifndef OBSERVE_H_
#define OBSERVE_H_
class Observe {
public:
void update(string messages);
};
#endif /* OBSERVE_H_ */
具体被观察者 :
.cpp:
具体观察者
.h
#ifndef USER_H_#
define USER_H_#
include "Observe.h"#
include
using namespace std;
class user : public Observe
{
private:
string name;
string message;
public:
user(string name);
~user();
void update(string message);
void read();
};
#endif /* USER_H_ */
.cpp