定義
定義對象間的一種一對多(變化)的依賴關(guān)系,以便當一個對象(Subject)的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動更新。
——《設計模式》GoF
使用場景
一個對象(目標對象)的狀態(tài)發(fā)生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
結(jié)構(gòu)
文章來源:http://www.zghlxwxcb.cn/news/detail-638443.html
代碼示例
//Observer.h
/****************************************************/
#ifndef OBSERVER_H
#define OBSERVER_H
#include<iostream>
#include<list>
using namespace std;
class Observer {
public:
//構(gòu)造
Observer(){ }
//析構(gòu)
virtual ~Observer(){ }
//更新
virtual void updata(){ }
};
class Server {
private:
//觀察者鏈表
list<Observer*> m_Observer;
protected:
//服務器狀態(tài)
string m_Status;
public:
//構(gòu)造函數(shù)
Server(){ }
//析構(gòu)函數(shù)
virtual ~Server(){ }
//添加觀察者
void Attach(Observer* observer) {
this->m_Observer.push_back(observer);
}
//移除觀察者
void Remove(Observer* observer) {
this->m_Observer.remove(observer);
}
//設置服務器狀態(tài)
virtual void SetStatus(string s){ }
//獲取服務器狀態(tài)
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:
//構(gòu)造
Concrete_Server(string name) {
this->m_Name = name;
}
//析構(gòu)
~Concrete_Server(){ }
//設置服務器狀態(tài)
virtual void SetStatus(string s) {
this->m_Status = "("+this->m_Name+")"+s;
}
//獲取服務器狀態(tài)
virtual string GetStatus() {
return this->m_Status;
}
};
//具體觀察者
class Concrete_Observer : public Observer {
private:
//觀察者名稱
string m_Name;
//需要觀察的服務器
Server* m_Server;
public:
//構(gòu)造
Concrete_Observer(string name, Server* server) {
this->m_Name = name;
this->m_Server = server;
}
//析構(gòu)
~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更新系統(tǒng)");
server1->Notify();
delete server1;
server1 = NULL;
delete observer1;
observer1 = NULL;
return 0;
}
運行結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-638443.html
要點總結(jié)
- 使用面向?qū)ο蟮某橄?,Observer模式使得我們可以獨立地改變目標與觀察者,從而使二者之間的依賴關(guān)系達致松耦合。
- 目標發(fā)送通知時,無需指定觀察者,通知(可以攜帶通知信息作為參數(shù))會自動傳播。
- 觀察者自己決定是否需要訂閱通知,目標對象對此一無所知。
- Observer模式是基于事件的UI框架中非常常用的設計模式,也是MVC模式的一個重要組成部分。
到了這里,關(guān)于觀察者模式(C++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!