观察者模式:定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知,并自动更新。
通过观察者定义我们可以知道,有一个对象,他会提供数据,另外还有很多对象,他们需要这些数据来进行各自的活动。下面我们以一个天气情况为例来对观察者模式进行描述。
我们有许多部门需要获取我们天气情况,他们是我们的观察者。而天气是我们的被观察者,当我们的天气发生改变时,我们需要告诉所有的观察者。
在观察者模式中,我们需要以下几个类:
一、主题类。主要实现注册观察者,数据发生改变时通知观察者,注销观察者。
class SubjectFather
{
public:
void registerObserver(ObserverFather *ob); //注册观察者
void removeObserver(ObserverFather *ob); //注销观察者
void notifyObserver(); //通知观察者
private:
std::vector<ObserverFather *> m_observerVector; //存放各个注册的观察者对象。
};
void SubjectFather::registerObserver(ObserverFather *ob)
{
m_observerVector.push_back(ob);
}
void SubjectFather::notifyObserver() //通知观察者
{
std::vector<ObserverFather *>::iterator iter;
for(iter = m_observerVector.begin();iter!=m_observerVector.end();iter++)
(*iter)->updata();//调用各个观察者的updata 函数进行处理。
}
二、抽象的观察者基类。主要作用为:通过父类来指向不同的子类,明确主题发生变化时,通过updata来传递到各个观察者。这是主题和子观察者都要用到的类,主题主要用它来指向各个子观察者,子观察者主要是继承它。
class ObserverFather
{
public:
ObserverFather(){}
~ObserverFather(){}
virtual void updata() = 0;//可以考虑把数据封装成类,这里传入封装类的对象,在各个具体的观察者中,可以通过数据类来获取相应的数据
};
三、继承观察者基类的具体观察者。
class FirstObserver : public ObserverFather
{
public:
FirstObserver(SubjectFather *subject); //构造对象完成时,就把这个对象注册到 主题中。
~FirstObserver(SubjectFather *subject); //在主题中注销这个对象
void updata();
};
FirstObserver::FirstObserver(SubjectFather *subject)
{
subject->registerObserver(this); //注册
}
void FirstObserver::updata()
{
//收到通知,执行具体的操作
}
四、简单示例:
int main()
{
SubjectFather *subject = new SubjectFather();
FirstObserver *first = new FirstObserver(subject);
subject->notifyObserver(); //主题更改时,通知各个观察者
return 0;
}