深圳網(wǎng)站建設(shè)服務(wù)商萬創(chuàng)網(wǎng)網(wǎng)站代運營推廣
文章目錄
- 行為型模式:觀察者模式
行為型模式:觀察者模式
觀察者模式定義了一種一對多的依賴關(guān)系:它讓一個主題(被觀察者)對象關(guān)聯(lián)多個觀察者對象,并且當(dāng)主題對象的狀態(tài)發(fā)生變化時,它會主動通知這些觀察者對象,使它們能夠自動更新自己或執(zhí)行相應(yīng)的響應(yīng)操作。
以一個設(shè)備的溫度顯示系統(tǒng)為例,在這個示例中,溫度檢測儀是被觀察者,當(dāng)設(shè)備溫度發(fā)生變化時,它會通知所有的顯示器更新溫度信息。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // 觀察者接口
class IObserver {
public:virtual void update(float temperature) = 0;virtual ~IObserver() {}
};// 主題接口(Subject)
class ISubject {
public:virtual void registerObserver(IObserver* observer) = 0;virtual void removeObserver(IObserver* observer) = 0;virtual void notifyObservers() = 0;virtual ~ISubject() {}
};// 被觀察者類:設(shè)備溫度檢測儀
class DeviceTemperatureMonitor : public ISubject {
private:std::vector<IObserver*> observers;float temperature;public:// 注冊觀察者void registerObserver(IObserver* observer) override {observers.push_back(observer);}// 移除觀察者void removeObserver(IObserver* observer) override {// std::remove將所有與指定值observer相等的元素移動到容器的末尾,并返回指向第一個不需要保留的元素的迭代器observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());}// 通知所有觀察者void notifyObservers() override {for (IObserver* observer : observers) {observer->update(temperature);}}// 設(shè)置溫度狀態(tài)并通知所有觀察者void setTemperature(float temp) {temperature = temp;notifyObservers();}
};// 觀察者類:手機顯示器
class PhoneDisplay : public IObserver {
private:std::string deviceName;public:PhoneDisplay(const std::string& name) : deviceName(name) {}void update(float temperature) override {std::cout << "Phone Display (" << deviceName << ") - Device Temperature: " << temperature << "°C\n";}
};// 觀察者類:窗口顯示器
class WindowDisplay : public IObserver {
private:std::string location;public:WindowDisplay(const std::string& loc) : location(loc) {}void update(float temperature) override {std::cout << "Window Display at " << location << " - Device Temperature: " << temperature << "°C\n";}
};int main() {// 創(chuàng)建被觀察者對象(設(shè)備溫度檢測儀)DeviceTemperatureMonitor tempMonitor;// 創(chuàng)建觀察者對象(顯示設(shè)備)PhoneDisplay phoneDisplay1("iPhone");PhoneDisplay phoneDisplay2("Samsung");WindowDisplay windowDisplay("Office");// 注冊觀察者tempMonitor.registerObserver(&phoneDisplay1);tempMonitor.registerObserver(&phoneDisplay2);tempMonitor.registerObserver(&windowDisplay);// 模擬溫度數(shù)據(jù)更新std::cout << "Temperature Update 1:\n";tempMonitor.setTemperature(75.0f);std::cout << "\nTemperature Update 2:\n";tempMonitor.setTemperature(80.0f);// 移除一個觀察者tempMonitor.removeObserver(&phoneDisplay2);std::cout << "\nTemperature Update 3 (After removing Samsung Phone Display):\n";tempMonitor.setTemperature(85.0f);return 0;
}
Temperature Update 1:
Phone Display (iPhone) - Device Temperature: 75°C
Phone Display (Samsung) - Device Temperature: 75°C
Window Display at Office - Device Temperature: 75°CTemperature Update 2:
Phone Display (iPhone) - Device Temperature: 80°C
Phone Display (Samsung) - Device Temperature: 80°C
Window Display at Office - Device Temperature: 80°CTemperature Update 3 (After removing Samsung Phone Display):
Phone Display (iPhone) - Device Temperature: 85°C
Window Display at Office - Device Temperature: 85°C