定義 觀察者模式是一種行為型設計模式,它定義了一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都會收到通知並自動更新。這種模式用於實現對象之間的解耦,使得一個對象的變化可以通知並更新多個依賴對象,而無需直接引用它們。 為什麼使用觀察者模式? 解耦 觀察者模式將觀察者(Observ ...
定義
觀察者模式是一種行為型設計模式,它定義了一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都會收到通知並自動更新。這種模式用於實現對象之間的解耦,使得一個對象的變化可以通知並更新多個依賴對象,而無需直接引用它們。為什麼使用觀察者模式?
-
解耦
- 觀察者模式將觀察者(Observer)和被觀察者(Subject)解耦,兩個對象之間的依賴關係被轉化為依賴介面。
-
動態增加觀察者
- 觀察者模式允許在運行時動態增加或刪除觀察者,靈活性更高。
-
維護簡便
- 當被觀察者的狀態發生變化時,所有依賴對象自動更新,無需手動管理這些依賴關係,簡化了維護。
實現步驟
-
定義抽象主題類
- 定義一個抽象主題類,聲明添加、刪除觀察者的方法,以及通知所有觀察者的方法。
-
實現具體主題類
- 實現具體主題類,包含狀態變化時的通知邏輯。
-
定義抽象觀察者類
- 定義一個抽象觀察者類,聲明更新方法,具體觀察者實現這個方法來更新自身狀態。
-
實現具體觀察者類
- 實現具體觀察者類,實現更新方法,根據被觀察者的變化更新自身狀態。
優缺點和適用場景
優點
-
解耦
- 觀察者與被觀察者之間的耦合度降低,代碼更加模塊化和易於維護。
-
靈活性
- 可以動態地增加或刪除觀察者,靈活地響應需求變化。
-
自動更新
- 被觀察者狀態變化時,所有觀察者都會自動收到通知並更新狀態,無需手動調用。
缺點
-
可能導致性能問題
- 如果有大量觀察者,通知所有觀察者可能會導致性能開銷。
-
調試困難
- 觀察者模式涉及多個對象之間的通知和更新,可能會導致調試變得複雜。
適用場景
-
事件處理系統
- 例如 GUI 事件處理系統,當用戶觸發某個事件時,所有相關的處理函數都需要被通知。
-
模型-視圖-控制器(MVC)架構
- 模型(Model)作為被觀察者,視圖(View)作為觀察者,當模型的數據發生變化時,視圖會自動更新顯示。
-
訂閱-發佈系統
- 允許對象訂閱事件併在事件發生時接收通知,實現松耦合的事件處理機制。
例子:股票市場
假設我們有一個股票市場系統,當某隻股票的價格變化時,所有關註這隻股票的投資者都會收到通知。我們可以使用觀察者模式來實現這一功能。#include <iostream> #include <vector> #include <memory> /* 在這個例子中,當股票價格發生變化時,所有的投資者都會收到通知並更新他們的狀態。觀察者模式使得我們可以輕鬆地添加或刪除投資者,而不需要修改股票類的代碼,從而實現瞭解耦和靈活性。 */ // 抽象觀察者類:投資者 class Investor { public: virtual ~Investor() {} virtual void update(double price) = 0; }; // 具體觀察者類:具體投資者 class ConcreteInvestor : public Investor { private: std::string name; public: ConcreteInvestor(const std::string& name) : name(name) {} void update(double price) override { std::cout << "Investor " << name << " is notified. New stock price: " << price << std::endl; } }; // 抽象主題類:股票 class Stock { public: virtual ~Stock() {} virtual void addObserver(std::shared_ptr<Investor> investor) = 0; virtual void removeObserver(std::shared_ptr<Investor> investor) = 0; virtual void notifyObservers() = 0; }; // 具體主題類:具體股票 class ConcreteStock : public Stock { private: std::vector<std::shared_ptr<Investor>> investors; double price; public: void addObserver(std::shared_ptr<Investor> investor) override { investors.push_back(investor); } void removeObserver(std::shared_ptr<Investor> investor) override { investors.erase(std::remove(investors.begin(), investors.end(), investor), investors.end()); } void notifyObservers() override { for (const auto& investor : investors) { investor->update(price); } } void setPrice(double newPrice) { price = newPrice; notifyObservers(); } }; int main() { // 創建具體股票 std::shared_ptr<ConcreteStock> stock = std::make_shared<ConcreteStock>(); // 創建具體投資者 std::shared_ptr<Investor> investor1 = std::make_shared<ConcreteInvestor>("Alice"); std::shared_ptr<Investor> investor2 = std::make_shared<ConcreteInvestor>("Bob"); // 添加投資者到股票的觀察者列表中 stock->addObserver(investor1); stock->addObserver(investor2); // 修改股票價格 stock->setPrice(100.0); stock->setPrice(105.0); return 0; }