譯者 | 蔡柱梁
策劃 | 言征
Observable設計模式存在于許多Java API和響應式編程中。下面介紹Java中永恒的Observable模式。
Observable設計模式用于許多重要的Java API。一個眾所周知的示例是使用ActionListenerAPI執行操作的JButton。在這個例子中,我們ActionListener在按鈕上進行了監聽或觀察。單擊按鈕時,ActionListener將執行操作。
Observable模式也用于響應式編程。在反應式應用程序中使用觀察者是有道理的,因為反應式的本質是反應:當另一個進程發生時,事情就會發生。
Observable是一種行為設計模式。它的功能是在事件發生時執行一個動作。兩個常見的例子是按鈕點擊和通知,但這種模式還有更多用途。
一、Observable模式的一個例子
在Observable模式中,一個對象在執行操作時通知另一個對象。為了理解該模式的價值,讓我們想象一個需要單擊按鈕并且沒有通知另一個對象的場景,如圖1所示。
請注意,ActionCheck必須每秒檢查一次按鈕?,F在,想象一下,如果我們每秒對該按鈕進行多次操作檢查。您能想象這會對您的應用程序性能產生什么影響嗎?
讓Do Something按鈕通知ActionCheck.這樣,ActionCheck邏輯就不需要每秒輪詢Do Something按鈕。
二、Observable設計模式的元素
在下圖中,請注意觀察者模式的基礎是Observer接口(即觀察的對象)和Subject(被觀察的對象)。類NewsletterimplementsSubject和Subscriberimplements Observer。最后,SendEmailMain執行Observable設計模式。
三、代碼中的Observable模式
Subject接口,也稱為Observableor Publisher,是Observable設計模式的基礎?;旧?,它存儲觀察者并在觀察到的動作發生時立即通知他們??匆幌耂ubject界面。
1.觀察者界面
接口(Observer有時也稱為Subscriber)由訂閱者實現,它試圖觀察是否已執行操作:
2.行動中可觀察
讓我們用一個時事通訊的例子來實現這個Subject接口。在下面的代碼中,我們存儲我們的觀察者(在本例中為時事通訊訂閱者),并且當他們的電子郵件被添加到訂閱時,每個訂閱者都會收到通知。
@Override
@Override
@Override
3.訂閱者
Subscriber類表示訂閱電子郵件時事通訊的用戶。此類實現了Observer接口。它是我們將觀察的對象,以便我們知道是否發生了事件。
@Override
4.發送郵件主
現在我們有了使Observable模式有效工作的主類。首先,我們將創建Newsletter對象。然后,我們將添加和刪除訂閱者。最后,我們將添加一封電子郵件并通知訂閱者他們的狀態。
這是我們代碼的輸出:
五、何時使用Observable模式
當一個動作發生并且需要通知多個對象時,最好使用Observable模式而不是Object多次檢查狀態。想象一下,有 200多個對象需要接收通知;在這種情況下,您必須將200乘以檢查發生的次數。
通過使用Observable模式,通知只會對所有訂閱者發生一次。這是一個巨大的性能提升,也是一種有效的代碼優化。此代碼可以輕松擴展或更改。
反應式編程范式到處都使用Observable模式。如果您曾經使用過Angular,那么您就會知道使用Observable組件非常普遍。響應式組件經常被其他事件和邏輯觀察到,當滿足特定條件時,組件將執行一些動作。
六、結論
以下是關于Observable設計模式,需要記住的要點:
Observable使用開閉SOLID原則。這意味著我們可以擴展addSubscriber和removeSubscriber方法而無需更改方法名。原因是它接收的是Subject接口而不是直接實現。
Observer界面觀察發生在Subject。
Subject也被稱為可觀察對象,因為它是一個將被觀察的主題。它也可以稱為發布器,因為它發布事件。
Observer也被稱為訂閱者,因為它訂閱了主題/發布者。操作發生時通知觀察者。
如果我們不使用Observable設計模式,訂閱者將不得不不斷輪詢以了解是否發生了事件,這可能會對應用程序性能造成嚴重影響。Observable是一個更有效的解決方案。
原文鏈接:??https://www.infoworld.com/article/3682139/intro-to-the-observable-design-pattern.html??
譯者介紹
蔡柱梁,51CTO社區編輯,從事Java后端開發8年,做過傳統項目廣電BOSS系統,后投身互聯網電商,負責過訂單,TMS,中間件等。