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