亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

c++如何實(shí)現(xiàn)觀察者模式_c++ 觀察者模式實(shí)現(xiàn)方法

裘德小鎮(zhèn)的故事
發(fā)布: 2025-10-16 21:22:01
原創(chuàng)
783人瀏覽過(guò)
觀察者模式通過(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)安全性。

c++如何實(shí)現(xiàn)觀察者模式_c++ 觀察者模式實(shí)現(xiàn)方法

觀察者模式是一種行為設(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)這一模式。

1. 定義觀察者接口(Observer)

觀察者需要有一個(gè)統(tǒng)一的更新接口,以便被通知狀態(tài)變化。

  • 創(chuàng)建一個(gè)抽象基類 Observer,包含純虛函數(shù) update()。
  • 每個(gè)具體觀察者類繼承該接口,并實(shí)現(xiàn)自己的 update 行為。

示例代碼:

class Observer {
public:
    virtual ~Observer() = default;
    virtual void update() = 0;
};
登錄后復(fù)制

2. 定義被觀察者(Subject)

被觀察者負(fù)責(zé)維護(hù)觀察者列表,并在狀態(tài)改變時(shí)通知它們。

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

  • 使用 std::vector<Observer*> 存儲(chǔ)觀察者指針。
  • 提供添加、刪除和通知觀察者的方法。
  • 狀態(tài)變更后調(diào)用 notify() 遍歷所有觀察者并觸發(fā) update。

示例代碼:

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;
}
登錄后復(fù)制

};

3. 實(shí)現(xiàn)具體觀察者

具體觀察者根據(jù) subject 的狀態(tài)做出響應(yīng)。

千帆大模型平臺(tái)
千帆大模型平臺(tái)

面向企業(yè)開(kāi)發(fā)者的一站式大模型開(kāi)發(fā)及服務(wù)運(yùn)行平臺(tái)

千帆大模型平臺(tái)0
查看詳情 千帆大模型平臺(tái)
  • 每個(gè)觀察者可以持有對(duì) subject 的引用(可選),以便獲取最新?tīng)顟B(tài)。
  • update() 中實(shí)現(xiàn)具體邏輯,如打印信息或更新自身狀態(tài)。

示例代碼:

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";
}
登錄后復(fù)制

};

4. 使用示例

將觀察者注冊(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;
登錄后復(fù)制

}

輸出結(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
登錄后復(fù)制

基本上就這些。這個(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é)教程(入門到精通)
c++速學(xué)教程(入門到精通)

c++怎么學(xué)習(xí)?c++怎么入門?c++在哪學(xué)?c++怎么學(xué)才快?不用擔(dān)心,這里為大家提供了c++速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來(lái)源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問(wèn)題
開(kāi)源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)