概述
觀察者模式(Observer Pattern)是一種行為型設(shè)計模式,它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽一個主題對象,當主題對象發(fā)生變化時,所有依賴于它的觀察者對象都會得到通知并更新。
在觀察者模式中,有兩個主要角色:
- Subject(主題):維護一個觀察者列表,提供方法用于添加、刪除和通知觀察者。
- Observer(觀察者):定義一個接口,用于接收主題對象的通知,以便在主題發(fā)生變化時更新自身狀態(tài)。
電商系統(tǒng)的應(yīng)用
促銷通知的例子:
假設(shè)我們有一個電商系統(tǒng),當某件商品有促銷活動時,需要通知所有訂閱了該商品的用戶。在這個例子中,商品是主題,用戶是觀察者
首先,我們創(chuàng)建一個Subject接口,表示主題:
public interface Subject {
void registerObserver(Observer o);//添加
void removeObserver(Observer o);//刪除
void notifyObservers();//通知
}
接下來,我們創(chuàng)建一個Observer接口,表示觀察者:
public interface Observer {
void update(String discountInfo);
}
現(xiàn)在,我們創(chuàng)建一個具體的主題,如Product,實現(xiàn)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();
}
}
接著,我們創(chuàng)建一個具體的觀察者,如User,實現(xiàn)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個具體的類。
現(xiàn)在我們可以創(chuàng)建一個Product實例(主題)并向其注冊User觀察者。當Product的促銷信息發(fā)生變化時,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折");
}
}
在這個例子中,我們創(chuàng)建了一個Product實例并向其注冊了兩個User觀察者。當Product的促銷信息發(fā)生變化時,所有觀察者都會收到通知并更新自己的顯示。這個例子展示了觀察者模式在電商系統(tǒng)中的應(yīng)用,如何實現(xiàn)商品和用戶之間的交互。
源碼應(yīng)用
觀察者模式在許多Java框架和庫中都有應(yīng)用,以下是一些常見的示例:
-
Java 內(nèi)置類庫:Java內(nèi)置了一些使用觀察者模式的類,例如 java.util.Observable 和 java.util.Observer。雖然在較新的Java版本中已經(jīng)不推薦使用,但它們?nèi)匀皇怯^察者模式的一個例子。你可以通過擴展 Observable 類并實現(xiàn) Observer 接口來創(chuàng)建自己的觀察者模式。
-
Swing GUI 框架:Swing中的事件監(jiān)聽就是觀察者模式的應(yīng)用。比如,你可以為按鈕添加動作監(jiān)聽器,當按鈕被點擊時,監(jiān)聽器會收到通知并執(zhí)行相應(yīng)的操作。
-
Spring Framework:Spring框架廣泛使用觀察者模式,特別是在事件驅(qū)動編程中。例如,Spring的事件機制允許你在應(yīng)用中發(fā)布和監(jiān)聽事件,當某些事件發(fā)生時,注冊的監(jiān)聽器會收到通知并執(zhí)行相應(yīng)的邏輯。
-
Android開發(fā):Android中的事件處理也是觀察者模式的應(yīng)用,例如,你可以為按鈕添加點擊事件監(jiān)聽器,當按鈕被點擊時,監(jiān)聽器會收到通知。文章來源:http://www.zghlxwxcb.cn/news/detail-651617.html
這些只是一些例子,觀察者模式在許多框架和應(yīng)用中都有廣泛的應(yīng)用。它提供了一種松耦合的方式,允許不同部分的代碼能夠在發(fā)生變化時保持同步,從而實現(xiàn)更加靈活和可維護的程序。文章來源地址http://www.zghlxwxcb.cn/news/detail-651617.html
到了這里,關(guān)于深入理解設(shè)計模式-行為型之觀察者的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!