定义
定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
——《设计模式》GoF
使用场景
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
结构
代码示例
//Observer.h
/****************************************************/
#ifndef OBSERVER_H
#define OBSERVER_H
#include<iostream>
#include<list>
using namespace std;
class Observer {
public:
//构造
Observer(){ }
//析构
virtual ~Observer(){ }
//更新
virtual void updata(){ }
};
class Server {
private:
//观察者链表
list<Observer*> m_Observer;
protected:
//服务器状态
string m_Status;
public:
//构造函数
Server(){ }
//析构函数
virtual ~Server(){ }
//添加观察者
void Attach(Observer* observer) {
this->m_Observer.push_back(observer);
}
//移除观察者
void Remove(Observer* observer) {
this->m_Observer.remove(observer);
}
//设置服务器状态
virtual void SetStatus(string s){ }
//获取服务器状态
virtual string GetStatus() {
return this->m_Status;
}
//通知观察者
void Notify() {
for (list<Observer*>::iterator iter = this->m_Observer.begin();iter != m_Observer.end(); iter++) {
(*iter)->updata();
}
}
};
//具体服务器
class Concrete_Server : public Server {
private:
//用户名称
string m_Name;
public:
//构造
Concrete_Server(string name) {
this->m_Name = name;
}
//析构
~Concrete_Server(){ }
//设置服务器状态
virtual void SetStatus(string s) {
this->m_Status = "("+this->m_Name+")"+s;
}
//获取服务器状态
virtual string GetStatus() {
return this->m_Status;
}
};
//具体观察者
class Concrete_Observer : public Observer {
private:
//观察者名称
string m_Name;
//需要观察的服务器
Server* m_Server;
public:
//构造
Concrete_Observer(string name, Server* server) {
this->m_Name = name;
this->m_Server = server;
}
//析构
~Concrete_Observer(){ }
//更新
virtual void updata() {
cout << this->m_Name << ": " << this->m_Server->GetStatus() << endl;
}
};
#endif
//test.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Observer.h"
int main()
{
Server* server1 = new Concrete_Server("服务器1");
Observer* observer1 = new Concrete_Observer("观察者1", server1);
Observer* observer2 = new Concrete_Observer("观察者2", server1);
server1->Attach(observer1);
server1->Attach(observer2);
server1->SetStatus("2.1.0.001更新系统");
server1->Notify();
delete server1;
server1 = NULL;
delete observer1;
observer1 = NULL;
return 0;
}
运行结果:
要点总结
- 使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
- 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。
- 观察者自己决定是否需要订阅通知,目标对象对此一无所知。
- Observer模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分。