目錄
- 一、 啥是觀察者模式?
- 二、 為什么要用觀察者模式?
- 三、 觀察者模式的實現方式
- 四、 觀察者模式的優缺點
- 五、 觀察者模式的應用場景
- 六、 總結
🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解狀態模式請看: (十 七)趣學設計模式 之 狀態模式!
?更多請看個人主頁: 碼熔burning
這篇文章帶你詳細認識一下設計模式中的觀察者模式
一、 啥是觀察者模式?
想象一下,你訂閱了一個你喜歡的博主的博客 ??。 只要博主發布了新的文章,你就會立刻收到通知 🔔。 觀察者模式就像是這種訂閱機制,當一個對象(博主)的狀態發生改變時,所有依賴于它的對象(訂閱者)都會收到通知并自動更新。
觀察者模式,就是定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象的狀態發生改變時,會通知所有觀察者對象,使它們能夠自動更新 🎁。
簡單來說,就是讓多個“粉絲”時刻關注著“偶像”,一旦“偶像”有啥動靜,“粉絲”們立刻知道!
- 一個對象的狀態改變需要通知多個其他對象: 就像博主發布新文章需要通知所有訂閱者 📢!
- 對象之間的依賴關系應該是松耦合的: 就像訂閱者可以隨時取消訂閱,而不會影響博主的正常運作 🤝!
- 你需要實現發布-訂閱(Publish-Subscribe)模式: 就像博主發布文章,訂閱者接收通知 📰!
二、 為什么要用觀察者模式?
用觀察者模式,好處多多 👍:
- 解耦主題和觀察者: 主題對象不需要知道觀察者對象的具體類型,只需要知道它們實現了觀察者接口 🤝!
- 支持廣播通信: 主題對象可以同時通知多個觀察者對象 📣!
- 動態添加和刪除觀察者: 可以方便地添加和刪除觀察者對象,而無需修改主題對象的代碼 ??!
- 提高代碼的可維護性和可擴展性: 將主題和觀察者的邏輯分離,使得代碼更加清晰易懂 💡!
三、 觀察者模式的實現方式
觀察者模式主要包含兩個核心概念:
- 主題(Subject): 也稱為可觀察對象,維護一個觀察者列表,并提供添加、刪除和通知觀察者的方法 🏠!
- 觀察者(Observer): 定義了一個更新接口,當主題對象的狀態發生改變時,會調用這個接口來通知觀察者 ??!
// 觀察者接口:訂閱者public interface Observer {void update(String message); // 更新消息
}// 具體觀察者:用戶public class User implements Observer {private String name;public User(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 收到消息: " + message);}
}// 主題接口:公眾號public interface Subject {void registerObserver(Observer observer); // 注冊觀察者void removeObserver(Observer observer); // 移除觀察者void notifyObservers(String message); // 通知觀察者
}// 具體主題:微信公眾號public class WeChatOfficialAccount implements Subject {private List<Observer> observers = new ArrayList<>();private String message;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {this.message = message;for (Observer observer : observers) {observer.update(message);}}public void publishMessage(String message) {System.out.println("公眾號發布消息: " + message);notifyObservers(message);}
}// 客戶端public class Client {public static void main(String[] args) {// 創建公眾號WeChatOfficialAccount officialAccount = new WeChatOfficialAccount();// 創建用戶User user1 = new User("張三");User user2 = new User("李四");User user3 = new User("王五");// 注冊用戶officialAccount.registerObserver(user1);officialAccount.registerObserver(user2);officialAccount.registerObserver(user3);// 發布消息officialAccount.publishMessage("今天發布了一篇新文章!");// 移除用戶officialAccount.removeObserver(user2);// 再次發布消息officialAccount.publishMessage("明天要舉辦一個活動!");}
}
代碼解釋
Observer
接口是觀察者接口,定義了update
方法,用于接收主題對象發送的通知。User
類是具體觀察者,實現了Observer
接口,負責處理接收到的通知。Subject
接口是主題接口,定義了registerObserver
、removeObserver
和notifyObservers
方法,用于管理觀察者列表和發送通知。WeChatOfficialAccount
類是具體主題,實現了Subject
接口,負責維護觀察者列表和發送通知。
輸出結果
公眾號發布消息: 今天發布了一篇新文章!
張三 收到消息: 今天發布了一篇新文章!
李四 收到消息: 今天發布了一篇新文章!
王五 收到消息: 今天發布了一篇新文章!
公眾號發布消息: 明天要舉辦一個活動!
張三 收到消息: 明天要舉辦一個活動!
王五 收到消息: 明天要舉辦一個活動!
四、 觀察者模式的優缺點
優點:
- 解耦主題和觀察者 🤝!
- 支持廣播通信 📣!
- 動態添加和刪除觀察者 ??!
- 提高代碼的可維護性和可擴展性 💡!
缺點:
- 如果觀察者過多,通知會消耗大量資源 😫!
- 觀察者之間可能存在循環依賴,導致系統崩潰 🤯!
- 難以保證通知的可靠性,如果某個觀察者處理通知失敗,可能會影響其他觀察者 😞!
五、 觀察者模式的應用場景
- GUI 事件處理: 按鈕點擊、鼠標移動等等 🖱?!
- 消息隊列: 發布-訂閱模式 📨!
- 股票行情: 股票價格變化通知 📈!
- 天氣預報: 天氣變化通知 ??🌧?!
六、 總結
- 觀察者模式就像“偶像”和“粉絲”,一旦“偶像”有啥動靜,“粉絲”們立刻知道! 🤩
- 核心概念包括主題和觀察者! 🔑
- 優點是解耦主題和觀察者、支持廣播通信、動態添加和刪除觀察者、提高代碼的可維護性和可擴展性! 👍
- 缺點是如果觀察者過多,通知會消耗大量資源、觀察者之間可能存在循環依賴、難以保證通知的可靠性! 👎
- 適用于一個對象的狀態改變需要通知多個其他對象,并且對象之間的依賴關系應該是松耦合的場景! 🎯
希望這篇文章能讓你徹底理解觀察者模式! 💯 祝你學習愉快! 😄
看完請看:(十 九)趣學設計模式 之 中介者模式!