觀察者模式(Observer)定義了對象間一對多的聯繫。當一個對象的狀態發生變化時,所有與它有聯繫的觀察者對象都會得到通知。觀察者模式將被觀察的目標和觀察者解耦,一個目標可以有任意多的觀察者,觀察者也可以觀察任意多的目標,構成複雜的聯繫,而每個觀察者都不知道其他觀察者的存在。
GOOD:定義了一種一對多的關係,讓多個觀察對象(公司員工)同時監聽一個主題對象(祕書),主題對象狀態發生變化時,會通知所有的觀察者,使它們能夠更新自己。
C++實現:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 看股票的同事類(觀察對象,觀察者)
class Secretary;
class StockObserver
{
public:
StockObserver(string strName, Secretary* strSub)
{
name = strName;
sub = strSub;
}
void Update();
private:
string name;
Secretary* sub;
};
// 祕書類(主題對象,通知者)
class Secretary
{
public:
string action;
void Add(StockObserver ob) { observers.push_back(ob); }
void Notify()
{
vector<StockObserver>::iterator it;
for (it=observers.begin(); it!=observers.end(); ++it)
{
(*it).Update();
}
}
private:
vector<StockObserver> observers;
};
void StockObserver::Update()
{
cout << name << " : " << sub->action << ", begin to work" << endl;
}
int main()
{
// 創建通知者
Secretary* p = new Secretary();
// 觀察者
StockObserver* s1 = new StockObserver("Lazy", p);
StockObserver* s2 = new StockObserver("SnowFire", p);
// 加入通知隊列
p->Add(*s1);
p->Add(*s2);
// 事件
p->action = "The boss is coming...";
// 通知
p->Notify();
return 0;
}
參考:大話設計模式實現(C++版)