1、什麼是觀察者模式?
觀察者模式定義一系列對象之間的一對多關係,當一個對象改變、更新狀態時,依賴它的都會收到通知改變或者更新。
觀察者模式是一種行爲型模式。
2、爲什麼需要觀察者模式?
從定義中我們可以知道觀察者模式當對象改變時,其他依賴的對象都會收到改變信息的狀態。
從本例分析項目經理想知道進度情況,他只需要綁定進度,他就可以知道進度信息了,而無需關心如何操作,如果再增加一個想知道進度信息老闆呢?也很容易,也讓老闆綁定進度信息數據就好了,不想知道的時候就解除綁定,就不在獲取進度信息了。
所以在本案例場景中,觀察者是我們這個場景非常合適的設計。
3、如何實現觀察者模式?
自定義觀察者模式
實現如下
我們先來看一下這個UML類圖進行分析
4.優點與缺點
觀察者模式優點:
觀察者和被觀察者是抽象耦合的
察者模式實現了動態聯動
觀察者模式支持廣播通信
觀察者模式缺點:
如一個主題被大量觀察者註冊,則通知所有觀察者會花費較高代價
如果某些觀察者的響應方法被阻塞,整個通知過程即被阻塞,其它觀察者不能及時被通知
demo:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Secretary;
class Obersever{
public:
Obersever(string name,Secretary* secretary):m_name(name),m_secretary(secretary){}
void uptate(string action){
cout<<"observer:"<<m_name<<",receive action:"<<action<<endl;
}
private:
string m_name;
Secretary* m_secretary;
};
//notify
class Secretary{
public:
void addobserver(Obersever *o){
v.push_back(o);
}
void Notify(string action)
{
for(vector<Obersever*>::iterator it=v.begin();it!=v.end();it++){
(*it)->uptate(action);
}
}
void setaction(string action)
{
m_action=action;
Notify(m_action);
}
private:
string m_action;
vector<Obersever*> v;
};
int main()
{
//
Secretary * s1=new Secretary;
//notify object
Obersever *po1=new Obersever("zhong",s1);
s1->addobserver(po1);
Obersever *po2=new Obersever("xian",s1);
s1->addobserver(po2);
s1->setaction("boss is coming");
}