溫馨提示×

如何用C++實現(xiàn)觀察者模式

c++
小樊
83
2024-08-29 18:47:13
欄目: 編程語言

觀察者模式(Observer Pattern)是一種設(shè)計模式,它定義了對象之間的一對多依賴關(guān)系,當(dāng)一個對象(被觀察對象,也稱為主題subject)的狀態(tài)發(fā)生變化時,所有依賴于它的對象(觀察者observer)都會得到通知并自動更新

以下是使用C++實現(xiàn)觀察者模式的示例代碼:

#include<iostream>
#include <list>

// 觀察者接口
class Observer {
public:
    virtual void update() = 0;
};

// 具體觀察者
class ConcreteObserver : public Observer {
public:
    void update() override {
        std::cout << "Observer received a notification!"<< std::endl;
    }
};

// 被觀察對象(主題)接口
class Subject {
public:
    virtual void registerObserver(Observer* observer) = 0;
    virtual void removeObserver(Observer* observer) = 0;
    virtual void notifyObservers() = 0;
};

// 具體主題
class ConcreteSubject : public Subject {
private:
    std::list<Observer*> observers;

public:
    void registerObserver(Observer* observer) override {
        observers.push_back(observer);
    }

    void removeObserver(Observer* observer) override {
        observers.remove(observer);
    }

    void notifyObservers() override {
        for (Observer* observer : observers) {
            observer->update();
        }
    }

    void changeState() {
        std::cout << "Subject state changed!"<< std::endl;
        notifyObservers();
    }
};

int main() {
    // 創(chuàng)建具體主題和觀察者對象
    ConcreteSubject subject;
    ConcreteObserver observer1, observer2;

    // 注冊觀察者
    subject.registerObserver(&observer1);
    subject.registerObserver(&observer2);

    // 改變主題狀態(tài),觸發(fā)通知
    subject.changeState();

    return 0;
}

在這個示例中,我們首先定義了Observer接口和ConcreteObserver具體實現(xiàn)類。然后,我們定義了Subject接口和ConcreteSubject具體實現(xiàn)類。ConcreteSubject類維護了一個觀察者列表,并提供了注冊、移除觀察者和通知觀察者的方法。

main()函數(shù)中,我們創(chuàng)建了一個ConcreteSubject對象和兩個ConcreteObserver對象。然后,我們將這兩個觀察者注冊到主題中。當(dāng)我們調(diào)用changeState()方法改變主題狀態(tài)時,它會自動通知所有已注冊的觀察者。運行此程序,你將看到每次主題狀態(tài)發(fā)生變化時,觀察者都會收到通知。

0