概述
觀察者模式(Observer Pattern)是一種行為型設計模式,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽一個主題對象,當主題對象發生變化時,所有依賴于它的觀察者對象都會得到通知并更新。
在觀察者模式中,有兩個主要角色:
- Subject(主題):維護一個觀察者列表,提供方法用于添加、刪除和通知觀察者。
- Observer(觀察者):定義一個接口,用于接收主題對象的通知,以便在主題發生變化時更新自身狀態。
電商系統的應用
促銷通知的例子:
假設我們有一個電商系統,當某件商品有促銷活動時,需要通知所有訂閱了該商品的用戶。在這個例子中,商品是主題,用戶是觀察者
首先,我們創建一個Subject接口,表示主題:
public interface Subject {void registerObserver(Observer o);//添加void removeObserver(Observer o);//刪除void notifyObservers();//通知
}
接下來,我們創建一個Observer接口,表示觀察者:
public interface Observer {void update(String discountInfo);
}
現在,我們創建一個具體的主題,如Product,實現Subject接口:
public class Product implements Subject {private ArrayList<Observer> observers;// 折扣消息private String discountInfo;public Product() {observers = new ArrayList<>();}public void registerObserver(Observer o) {observers.add(o);}public void removeObserver(Observer o) {int index = observers.indexOf(o);if (index >= 0) {observers.remove(index);}}public void notifyObservers() {for (Observer o : observers) {o.update(discountInfo);}}public void discountChanged() {notifyObservers();}public void setDiscountInfo(String discountInfo) {this.discountInfo = discountInfo;discountChanged();}
}
接著,我們創建一個具體的觀察者,如User,實現Observer接口:
public class User implements Observer {private String userName;private String discountInfo;private Subject product;public User(String userName, Subject product) {this.userName = userName;this.product = product;product.registerObserver(this);}public void update(String discountInfo) {this.discountInfo = discountInfo;display();}public void display() {System.out.println("用戶 " + userName + " 收到促銷通知: " + discountInfo);}
}
2個接口,2個具體的類。
現在我們可以創建一個Product實例(主題)并向其注冊User觀察者。當Product的促銷信息發生變化時,User會收到通知并顯示促銷信息。
public class Main {public static void main(String[] args) {//注冊2個用戶User user1 = new User("張三", product);User user2 = new User("李四", product);// 模擬商品促銷信息更新Product product = new Product();product.setDiscountInfo("本周末滿100減50");product.setDiscountInfo("雙十一全場5折");}
}
在這個例子中,我們創建了一個Product實例并向其注冊了兩個User觀察者。當Product的促銷信息發生變化時,所有觀察者都會收到通知并更新自己的顯示。這個例子展示了觀察者模式在電商系統中的應用,如何實現商品和用戶之間的交互。
源碼應用
觀察者模式在許多Java框架和庫中都有應用,以下是一些常見的示例:
-
Java 內置類庫:Java內置了一些使用觀察者模式的類,例如 java.util.Observable 和 java.util.Observer。雖然在較新的Java版本中已經不推薦使用,但它們仍然是觀察者模式的一個例子。你可以通過擴展 Observable 類并實現 Observer 接口來創建自己的觀察者模式。
-
Swing GUI 框架:Swing中的事件監聽就是觀察者模式的應用。比如,你可以為按鈕添加動作監聽器,當按鈕被點擊時,監聽器會收到通知并執行相應的操作。
-
Spring Framework:Spring框架廣泛使用觀察者模式,特別是在事件驅動編程中。例如,Spring的事件機制允許你在應用中發布和監聽事件,當某些事件發生時,注冊的監聽器會收到通知并執行相應的邏輯。
-
Android開發:Android中的事件處理也是觀察者模式的應用,例如,你可以為按鈕添加點擊事件監聽器,當按鈕被點擊時,監聽器會收到通知。
這些只是一些例子,觀察者模式在許多框架和應用中都有廣泛的應用。它提供了一種松耦合的方式,允許不同部分的代碼能夠在發生變化時保持同步,從而實現更加靈活和可維護的程序。