定义:
定义对象间的一种一对多(变化)的的依赖关系,以便当一个对象的状态发生改变是,所有依赖于它的对象都得到通知并自动更新
作用:
1、在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,当一个目标对象的状态发生改变,所有的依赖对象即观察者都将得到通知。如果这样的依赖关系过于紧密,将使软件不能做到适应业务变化。
2、弱化依赖关系,形成一种稳定的依赖关系。从而达到结构的松耦合。
模型:
1、推模型:把具体的内容相当于广播模式推送给目标对象
2、拉模型:目标对象在通知观察者时,只传递少量的信息。如果观察者需要更具体的信息,由观察者主动到目标对象中获取u,相当于是从观察者从目标对象中拉取数据。
UML结构:

结构代码:
```c++
#include <iostream>
#include <list>
using namespace std;
class Subject;
class Observer
{
public:
Observer(){}
virtual ~Observer(){}
virtual void update(Subject *subject) = 0;
virtual void update(string content) = 0;
};
class Subject
{
public:
Subject(){}
virtual ~Subject(){};
virtual void setContent(string _content) = 0;
virtual string getContent() = 0;
virtual string getAbstractContent() = 0;
//订阅
void attach(Observer *observer)
{
observers.push_back(observer);
}
//取消订阅
void detach(Observer *observer)
{
observers.remove(observer);
}
protected:
//通知所有订阅者
void notifyObservers()
{
for(Observer *reader : observers)
{
reader->update(this); //拉模型
}
}
//通知所有订阅者
void notifyObservers(string _content)
{
for(Observer *reader : observers)
{
reader->update(_content); //推模型
}
}
private:
list<Observer *> observers;
};
class Reader : public Observer
{
public:
Reader(){}
~Reader(){}
void update(Subject *subject)
{
cout << m_username << "订阅的消息内容:" << subject->getContent() << endl;
}
//推模型(粒度更大)
void update(string _content)
{
cout << m_username << "订阅的消息内容:" << _content << endl;
}
string getUsername()
{
return m_username;
}
void setUsername(string _username)
{
m_username = _username;
}
private:
string m_username;
};
class Push : public Subject
{
public:
Push(){}
~Push(){}
void setContent(string _content)
{
m_content = _content;
notifyObservers();
}
string getContent()
{
return m_content;
}
string getAbstractContent()
{
return "push information!";
}
private:
string m_content;
};
```
观察者扩展:
设置责任链模式,根据等级进行发布通知