觀察者模式(Observer Pattern)是一種行為型設(shè)計模式,它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有的觀察者對象,使它們能夠自動更新自己。
在鳳凰等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,鳳凰網(wǎng)站建設(shè)費用合理。在觀察者模式中,有三個角色:
- 主題(Subject):主題對象知道它的觀察者,并提供注冊和刪除觀察者的接口。
- 觀察者(Observer):為那些在目標(biāo)發(fā)生改變時需要獲得通知的對象定義一個更新接口。
- 具體觀察者(ConcreteObserver):存儲與主題的狀態(tài)自恰的狀態(tài)。具體觀察者角色實現(xiàn)了抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài) 像協(xié)調(diào)。
#include#include// 定義抽象主題類
class Subject
{
public:
virtual ~Subject() {}
// 注冊觀察者
virtual void registerObserver(Observer* observer) = 0;
// 刪除觀察者
virtual void removeObserver(Observer* observer) = 0;
// 通知觀察者
virtual void notifyObservers() = 0;
};
// 定義抽象觀察者類
class Observer
{
public:
virtual ~Observer() {}
// 更新方法
virtual void update(Subject* subject) = 0;
};
// 定義具體主題類
class ConcreteSubject : public Subject
{
public:
ConcreteSubject() : state_(0) {}
// 獲取狀態(tài)
int getState() const { return state_; }
// 設(shè)置狀態(tài)
void setState(int state)
{
state_ = state;
// 狀態(tài)改變,通知所有的觀察者
notifyObservers();
}
void notifyObservers()
{
// 遍歷所有的觀察者,調(diào)用更新方法
for (Observer* observer : observers_)
{
observer->update(this);
}
}
void registerObserver(Observer* observer)
{
observers_.push_back(observer);
}
void removeObserver(Observer* observer)
{
// 從觀察者列表中刪除觀察者
for (auto it = observers_.begin(); it != observers_.end(); ++it)
{
if (*it == observer)
{
observers_.erase(it);
break;
}
}
}
private:
int state_;
std::vectorobservers_;
};
// 定義具體觀察者類
class ConcreteObserver : public Observer
{
public:
ConcreteObserver(ConcreteSubject* subject, int id) : subject_(subject), id_(id)
{
// 注冊觀察者
subject_->registerObserver(this);
}
~ConcreteObserver()
{
// 刪除觀察者
subject_->removeObserver(this);
}
// 更新方法
void update(Subject* subject)
{
if (subject == subject_)
{
std::cout<< "Observer "<< id_<< ": subject state is "<< subject_->getState()<< std::endl;
}
}
private:
ConcreteSubject* subject_;
int id_;
};
int main()
{
ConcreteSubject* subject = new ConcreteSubject();
// 創(chuàng)建觀察者
Observer* observer1 = new ConcreteObserver(subject, 1);
Observer* observer2 = new ConcreteObserver(subject, 2);
// 改變主題的狀態(tài)
subject->setState(1);
// 再次改變主題的狀態(tài)
subject->setState(2);
// 刪除觀察者
delete observer1;
delete observer2;
delete subject;
return 0;
}
觀察者模式有以下幾個優(yōu)點:
- 觀察者模式可以實現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并使得表示層和數(shù)據(jù)邏輯層的變化獨立。
- 觀察者模式支持廣播通信。
- 觀察者模式簡化了對象之間的依賴關(guān)系,每個對象只需保存有關(guān)自己的狀態(tài),無需保存有關(guān)其他對象的狀態(tài),這避免了系統(tǒng)中對象之間的耦合關(guān)系。
觀察者模式也有一些缺點:
- 觀察者模式會增加系統(tǒng)的復(fù)雜度,因為可能會有很多的觀察者,所以需要維護(hù)這些觀察者之間的注冊關(guān)系。
- 如果一個觀察者對象的更新操作比較慢,會導(dǎo)致系統(tǒng)的效率降低。
- 觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目
主題對象與觀察者之間存在較強的耦合關(guān)系,一旦建立了這種關(guān)系,很難撤銷。
主題對象的更新需要通知所有的觀察者,如果觀察者數(shù)量較多,會導(dǎo)致性能下降。
觀察者之間存在循環(huán)依賴關(guān)系時,可能會導(dǎo)致系統(tǒng)崩潰。
主題對象的狀態(tài)發(fā)生變化時,可能會導(dǎo)致觀察者的狀態(tài)發(fā)生變化,這樣就可能會出現(xiàn)無限遞歸的情況。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
名稱欄目:觀察者模式(ObserverPattern)-創(chuàng)新互聯(lián)
新聞來源:http://www.muchs.cn/article38/dhojsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、定制網(wǎng)站、軟件開發(fā)、網(wǎng)站設(shè)計、網(wǎng)站制作、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容