觀察者模式通過(guò)定義一對(duì)多依賴關(guān)系實(shí)現(xiàn)對(duì)象間自動(dòng)通知。首先創(chuàng)建抽象基類Observer,包含純虛函數(shù)update();接著實(shí)現(xiàn)Subject類維護(hù)Observer指針容器,提供attach、detach和notify方法,在狀態(tài)改變時(shí)調(diào)用notify遍歷通知所有觀察者;然后設(shè)計(jì)ConcreteObserver類重寫update邏輯,可引用Subject獲取最新?tīng)顟B(tài);最后在main函數(shù)中注冊(cè)觀察者并修改狀態(tài)觸發(fā)通知,輸出顯示各觀察者按序接收更新信息。該實(shí)現(xiàn)需注意指針生命周期管理,推薦使用std::weak_ptr與std::shared_ptr增強(qiáng)安全性。
觀察者模式是一種行為設(shè)計(jì)模式,用于在對(duì)象之間定義一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴它的對(duì)象都會(huì)自動(dòng)收到通知。在 C++ 中,可以通過(guò)抽象基類、指針和容器來(lái)實(shí)現(xiàn)這一模式。
觀察者需要有一個(gè)統(tǒng)一的更新接口,以便被通知狀態(tài)變化。
示例代碼:
class Observer { public: virtual ~Observer() = default; virtual void update() = 0; };
被觀察者負(fù)責(zé)維護(hù)觀察者列表,并在狀態(tài)改變時(shí)通知它們。
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
示例代碼:
class Subject { private: std::vector<Observer*> observers; int state; <p>public: void attach(Observer* obs) { observers.push_back(obs); }</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">void detach(Observer* obs) { observers.erase( std::remove(observers.begin(), observers.end(), obs), observers.end() ); } void notify() { for (auto* obs : observers) { obs->update(); } } void setState(int s) { state = s; notify(); // 狀態(tài)改變,通知所有觀察者 } int getState() const { return state; }
};
具體觀察者根據(jù) subject 的狀態(tài)做出響應(yīng)。
示例代碼:
class ConcreteObserver : public Observer { private: int id; Subject& subject; <p>public: ConcreteObserver(int id, Subject& s) : id(id), subject(s) {}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">void update() override { std::cout << "Observer " << id << ": received update, new state = " << subject.getState() << "\n"; }
};
將觀察者注冊(cè)到 subject,修改狀態(tài)即可自動(dòng)通知。
int main() { Subject subject; <pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">ConcreteObserver o1(1, subject); ConcreteObserver o2(2, subject); subject.attach(&o1); subject.attach(&o2); subject.setState(10); // 兩個(gè)觀察者都被通知 subject.setState(20); // 再次通知 subject.detach(&o1); // 移除觀察者1 subject.setState(30); // 只有 o2 收到通知 return 0;
}
輸出結(jié)果:
Observer 1: received update, new state = 10 Observer 2: received update, new state = 10 Observer 1: received update, new state = 20 Observer 2: received update, new state = 20 Observer 2: received update, new state = 30
基本上就這些。這個(gè)實(shí)現(xiàn)簡(jiǎn)單清晰,適用于大多數(shù)場(chǎng)景。注意管理好指針生命周期,避免懸空引用。如果需要更安全的機(jī)制,可以用 std::weak_ptr 配合 std::shared_ptr 來(lái)管理觀察者。不復(fù)雜但容易忽略細(xì)節(jié)。
以上就是c++++如何實(shí)現(xiàn)觀察者模式_c++ 觀察者模式實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
c++怎么學(xué)習(xí)?c++怎么入門?c++在哪學(xué)?c++怎么學(xué)才快?不用擔(dān)心,這里為大家提供了c++速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)