1、什么是观察者模式?
观察者模式定义一系列对象之间的一对多关系,当一个对象改变、更新状态时,依赖它的都会收到通知改变或者更新。
观察者模式是一种行为型模式。
2、为什么需要观察者模式?
从定义中我们可以知道观察者模式当对象改变时,其他依赖的对象都会收到改变信息的状态。
从本例分析项目经理想知道进度情况,他只需要绑定进度,他就可以知道进度信息了,而无需关心如何操作,如果再增加一个想知道进度信息老板呢?也很容易,也让老板绑定进度信息数据就好了,不想知道的时候就解除绑定,就不在获取进度信息了。
所以在本案例场景中,观察者是我们这个场景非常合适的设计。
3、如何实现观察者模式?
自定义观察者模式
实现如下
我们先来看一下这个UML类图进行分析
4.优点与缺点
观察者模式优点:
观察者和被观察者是抽象耦合的
察者模式实现了动态联动
观察者模式支持广播通信
观察者模式缺点:
如一个主题被大量观察者注册,则通知所有观察者会花费较高代价
如果某些观察者的响应方法被阻塞,整个通知过程即被阻塞,其它观察者不能及时被通知
demo:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Secretary;
class Obersever{
public:
Obersever(string name,Secretary* secretary):m_name(name),m_secretary(secretary){}
void uptate(string action){
cout<<"observer:"<<m_name<<",receive action:"<<action<<endl;
}
private:
string m_name;
Secretary* m_secretary;
};
//notify
class Secretary{
public:
void addobserver(Obersever *o){
v.push_back(o);
}
void Notify(string action)
{
for(vector<Obersever*>::iterator it=v.begin();it!=v.end();it++){
(*it)->uptate(action);
}
}
void setaction(string action)
{
m_action=action;
Notify(m_action);
}
private:
string m_action;
vector<Obersever*> v;
};
int main()
{
//
Secretary * s1=new Secretary;
//notify object
Obersever *po1=new Obersever("zhong",s1);
s1->addobserver(po1);
Obersever *po2=new Obersever("xian",s1);
s1->addobserver(po2);
s1->setaction("boss is coming");
}