作用及理解:
一种一对多的消息处理方式。一个消息源的数据可以发给多个接收者,接收者可以灵活增加、减少。
这样,多个接收者可以使用这些数据去进行不同的处理,用于不同地方。
这个模式解决的核心问题是:解除消息源和消息接收者之间的耦合,使消息接收者可以随意增减,而不必修改消息源。
消息源出去的数据是固定的,各个接收者受到的数据都是固定的。
如下图所示,接收者可以随时加入或者退出,加入的接收者都会收到消息
一个简单的例子:
#include<iostream>
#include<cstdio>
#include<list>
struct Msg
{
int x,y,z;
};
class Observer;
class Subject
{
public:
Subject()
{};
virtual void registerObserver(Observer* o){};
virtual void removeObserver(Observer* o){};
virtual void notifyObserver(){};
};
class Observer
{
public:
virtual void update(Msg m){};
};
class RealSubject:public Subject
{
public:
std::list<Observer*> m_Observers;
Msg m_Msg;
public:
RealSubject()
{};
void registerObserver(Observer* o)
{
m_Observers.push_back(o);
}
void removeObserver(Observer* o)
{
m_Observers.remove(o);
}
void notifyObserver()
{
std::list<Observer*>::iterator it = m_Observers.begin();
for(; it != m_Observers.end(); ++it )
{
(*it)->update(m_Msg);
}
}
};
class realObserver1:public Observer
{
public:
realObserver1(RealSubject sbj)
{
//sbj.registerObserver(this);//不能在这里注册!!
}
void update(Msg m)
{
std::cout<<"realObserver1:"<<m.x<<std::endl;
}
};
class realObserver2:public Observer
{
public:
realObserver2(RealSubject sbj)
{
//sbj.registerObserver(this);
}
void update(Msg m)
{
std::cout<<"realObserver2:"<<m.x<<std::endl;
}
};
int main(int argc, char const *argv[])
{
RealSubject sbj;
realObserver1* ob1 = new realObserver1(sbj);
realObserver2* ob2 = new realObserver2(sbj);
sbj.registerObserver(ob1);
sbj.registerObserver(ob2);
int n = 0;
while(std::cin>> n && n != 0)
{
sbj.m_Msg.x = n;
sbj.notifyObserver();
}
return 0;
}
解析:
#####Subject为消息源,Observer为观察者,即消息接收者
#####可以看到,一旦Subject的信息有改动,就会调用 notifyObserver()这个函数(例子里为了简化,手动调的),用来通知所有的观察者。
#####观察者在update()里收到通知之后,就进行自己的操作。
#####之所以可以灵活增减观察者,是因为m_Observers这个list可以随意变动,而这个list又决定了哪些观察者可以接受消息。从而使Subject不会因为Observer数量增减而变动。
#####再来看Msg这个结构体,这个决定了所有中间传递的消息。所以说,发送和收到的数据是固定的。其实最终的原因还是Observer中update的参数固定。