什么是觀察者
觀察者模式的主要角色包括:
-
主題(Subject): 也稱為被觀察者或可觀察對象。它維護(hù)了一系列觀察者對象,并提供方法用于注冊、刪除和通知觀察者。當(dāng)主題的狀態(tài)發(fā)生改變時(shí),它會通知所有注冊的觀察者。
-
觀察者(Observer): 觀察主題的對象。觀察者定義了一個(gè)更新方法,主題在狀態(tài)改變時(shí)會調(diào)用這個(gè)方法來通知觀察者。觀察者可以根據(jù)主題的通知來執(zhí)行相應(yīng)的操作。
觀察者的應(yīng)用
觀察者模式在實(shí)際應(yīng)用中經(jīng)常用于處理事件驅(qū)動的編程場景,如圖形用戶界面(GUI)開發(fā)、消息傳遞系統(tǒng)等。通過觀察者模式,可以實(shí)現(xiàn)對象之間的解耦,提高系統(tǒng)的靈活性和可維護(hù)性。
在Spring Framework
中,觀察者模式的應(yīng)用非常廣泛,尤其在Spring的事件驅(qū)動機(jī)制中。Spring的事件機(jī)制允許對象在特定事件發(fā)生時(shí)發(fā)布事件,并允許其他對象注冊為監(jiān)聽器以接收這些事件。這與觀察者模式的概念非常相似,其中事件源就是觀察者模式中的主題,而事件監(jiān)聽器就是觀察者。
應(yīng)用程序事件: Spring允許應(yīng)用程序發(fā)布自定義事件,并提供了ApplicationEvent和ApplicationListener接口。應(yīng)用程序可以創(chuàng)建自定義事件類,并在需要時(shí)發(fā)布這些事件。其他對象可以實(shí)現(xiàn)ApplicationListener接口并注冊為監(jiān)聽器,以接收并處理這些事件。
Spring MVC事件: 在Spring MVC中,可以使用 ApplicationEventPublisher
接口發(fā)布自定義事件,并通過@EventListener注解或?qū)崿F(xiàn) ApplicationListener
接口的方式來處理這些事件。這使得在MVC架構(gòu)中進(jìn)行解耦和處理事件變得更加容易。
如何實(shí)現(xiàn)
日常中比較經(jīng)典的實(shí)例場景 , 舉個(gè)例子,如博客園的文章訂閱, 當(dāng)關(guān)注的作者發(fā)布了新的文章后,關(guān)注其的粉絲就會收到消息通知,這里將代碼拆出來如下。
import java.util.ArrayList;
import java.util.List;
// 主題接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String news);
}
// 觀察者接口
interface Observer {
void update(String news);
}
// 新聞發(fā)布者
class NewsPublisher implements Subject {
private List<Observer> observers = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String news) {
for (Observer observer : observers) {
observer.update(news);
}
}
public void publishNews(String news) {
System.out.println("發(fā)布新聞: " + news);
notifyObservers(news);
}
}
// 觀察者 - 讀者
class Reader implements Observer {
private String name;
public Reader(String name) {
this.name = name;
}
@Override
public void update(String news) {
System.out.println(name + " 收到新聞: " + news);
}
}
public class ObserverPatternExample {
// 創(chuàng)建新聞發(fā)布者
NewsPublisher publisher = new NewsPublisher();
// 創(chuàng)建兩個(gè)觀察者(讀者)
Observer reader1 = new Reader("小明");
Observer reader2 = new Reader("小紅");
// 注冊觀察者
publisher.registerObserver(reader1);
publisher.registerObserver(reader2);
// 發(fā)布新聞
publisher.publishNews("Java 21發(fā)布了!");
publisher.publishNews("Spring Framework 更新了!");
// 讀者取消訂閱
publisher.removeObserver(reader2);
// 再次發(fā)布新聞
publisher.publishNews("小米 su7 上線了,雷總為你開車門,快行動起來吧!");
}
}
程序運(yùn)行日志如下
發(fā)布新聞: Java 21發(fā)布了!
小明 收到新聞: Java 21發(fā)布了!
小紅 收到新聞: Java 21發(fā)布了!
發(fā)布新聞: Spring Framework 更新了!
小明 收到新聞: Spring Framework 更新了!
小紅 收到新聞: Spring Framework 更新了!
發(fā)布新聞: 小米 su7 上線了,雷總為你開車門,快行動起來吧!
小明 收到新聞: 小米 su7 上線了,雷總為你開車門,快行動起來吧!
結(jié)語
這里介紹觀察者,是希望從易于理解的概念開始對 Reactive Programing
的理解,在響應(yīng)式編程中多數(shù)基于觀察者模式思想演變而來,如在 Reactor 中,訂閱者(Subscriber)訂閱了數(shù)據(jù)流(Publisher),并在數(shù)據(jù)流中的元素發(fā)生變化時(shí)接收通知。
通知機(jī)制: 在觀察者模式中,主題狀態(tài)的變化會觸發(fā)通知,通知會被發(fā)送給所有注冊的觀察者。在Reactor中,數(shù)據(jù)流中的元素發(fā)生變化時(shí)會觸發(fā)通知,通知會被發(fā)送給所有訂閱了該數(shù)據(jù)流的訂閱者。文章來源:http://www.zghlxwxcb.cn/news/detail-854652.html
事件驅(qū)動編程: 觀察者模式和 Reactor 都支持事件驅(qū)動的編程模型。在觀察者模式中,事件源(主題)發(fā)生事件(狀態(tài)變化),并通知觀察者。在 Reactor 中,事件(數(shù)據(jù)元素)在流中傳遞,并且訂閱者可以對這些事件進(jìn)行響應(yīng)式地處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-854652.html
到了這里,關(guān)于什么是觀察者設(shè)計(jì)模式?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!