目录
1.简介
观察者模式中包含两种对象,分别是目标对象和观察者对象。在目标对象和观察者间存在着一种一对多的对应关系,当这个目标对象的状态发生变化时,所有依赖他的观察者对象都会得到通知并执行他们各自的特有的行为。
通俗地说,就好像这些观察者对象在时刻注视着目标对象(被观察)。无论何时该目标对象地状态发生变化这些观察者对象都能够马上直到,并根据目标对象地新状态执行相应地任务。
2.举例应用
比如我们手机上的天气App,它有多个界面组件,这些组件的作用分别是:显示摄氏温度,显示华氏温度,显示气温情况(如寒冷,炎热等)。当然该app应该还有另一个对象用于获取实时的天气数据,我们称他为天气对象。
这个天气对象和界面组件之间的依赖关系就可以用观察者模式实现,该天气对象就是目标对象,天气数据就是它的状态。这些界面组件就是观察者对象,当天气对象获取到新的天气数据时(此时它的状态改变了),它就通知所有依赖它的界面组件,这些组件就更新它们显示的内容。
3.结构组成
Subject:目标类,它是一个抽象类,也是所有目标对象的父类。它用一个列表记录当前目标对象有哪些观察者对象,并提供增加、删除观察者对象和通知观察者对象的接口。
Observer:观察者类,它也是一个抽象类,是所有观察者对象的父类;它为所有的观察者对象都定义了一个名为update的方法(也叫成员函数)。当目标对象的状态改变时,它就是通过调用它的所有观察者对象的update方法来通知它们的。
ConcreteSubject:具体目标类,可以有多个不同的具体目标类,它们同时继承Subject类。一个目标对象就是某个具体目标类的对象,一个具体目标类负责定义它自身的事务逻辑,并在状态改变时通知它的所有观察者对象。
ConcreteObserver:具体观察者类,可以有多个不同的具体观察者类,它们同时继承Observer类。一个观察者对象就是某个具体观察者类的对象。每个具体观察者类都要重定义Observer类中定义的update方法,在该方法中实现它自己的任务逻辑,当它被通知的时候(目标对象调用它的update方法)就执行自己特有的任务。
4.实例
//观察者类
class Observer{
public:
virtual void update(int n) = 0;
};
//目标类
class Subject{
public:
Subject(){}
//增加观察者对象的接口
void AddObserver(Observer* observer)
{
ObserverSet.insert(observer);
}
//删除观察者对象的接口
void EraseObserver(Observer* observer)
{
ObserverSet.erase(observer);
}
//通知每个观察者对象接口
void notify(int n)
{
set<Observer*>::iterator it;
for (it = ObserverSet.begin(); it != ObserverSet.end(); ++it)
{
(*it)->update(n);
}
}
private:
set<Observer*> ObserverSet;
};
class Observer1 :public Observer{
public:
void update(int n)
{
cout << "观察者1事件响应函数" << endl;
}
};
class Observer2 :public Observer{
public:
void update(int n)
{
cout << "观察者2事件响应函数" << endl;
}
};
int main()
{
Subject subject;
Observer* observer1 = new Observer1();
Observer* observer2 = new Observer2();
subject.AddObserver(observer1);
subject.AddObserver(observer2);
subject.notify(1);
subject.notify(4);
}