日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的观察者设计模式-示例教程

發布時間:2023/12/3 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的观察者设计模式-示例教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

觀察者模式行為設計模式之一 。 當您對對象的狀態感興趣并希望在發生任何更改時得到通知時,觀察者設計模式很有用。 在觀察者模式中,監視另一個對象狀態的對象稱為Observer ,而正在監視的對象稱為Subject 。 根據GoF,觀察者模式意圖是:

在對象之間定義一對多依賴關系,以便當一個對象更改狀態時,將自動通知和更新其所有依賴關系。

主題包含觀察者列表,以通知其狀態的任何變化,因此它應提供觀察者可以自己注冊和注銷的方法。 主題還包含一種將所有更改通知所有觀察者的方法,它既可以在通知觀察者的同時發送更新,也可以提供另一種獲取更新的方法。

觀察者應該有一個方法來設置要監視的對象,另一種方法將由Subject用來通知他們任何更新。

Java提供了一個內置平臺,用于通過java.util.Observable類和java.util.Observer接口實現Observer模式。 但是由于它的實現非常簡單,因此并未得到廣泛使用,并且大多數時候我們不想只為了實現Observer模式而擴展一個類,因為Java在類中不提供多重繼承。

Java消息服務(JMS)使用Observer模式Mediator模式來允許應用程序將數據訂閱和發布到其他應用程序。

模型-視圖-控制器(MVC)框架還使用觀察者模式,其中模型是主題,視圖是觀察者,可以注冊以獲取有關模型的任何更改的通知。

觀察者模式示例

對于我們的示例,我們將實現一個簡單的主題,觀察者可以注冊該主題。 每當將任何新消息發布到該主題時,所有注冊觀察者都會收到通知,他們可以使用該消息。

根據主題的要求,這里是基本主題接口,用于定義任何具體主題要實施的合同方法。

package com.journaldev.design.observer;public interface Subject {//methods to register and unregister observerspublic void register(Observer obj);public void unregister(Observer obj);//method to notify observers of changepublic void notifyObservers();//method to get updates from subjectpublic Object getUpdate(Observer obj);}

接下來,我們將為觀察者創建合同,將有一種方法將Subject附加到觀察者,另一種方法供Subject用來通知任何更改。

package com.journaldev.design.observer;public interface Observer {//method to update the observer, used by subjectpublic void update();//attach with subject to observepublic void setSubject(Subject sub); }

現在我們的合同已經準備好了,讓我們繼續具體執行該主題。

package com.journaldev.design.observer;import java.util.ArrayList; import java.util.List;public class MyTopic implements Subject {private List<Observer> observers;private String message;private boolean changed;private final Object MUTEX= new Object();public MyTopic(){this.observers=new ArrayList<>();}@Overridepublic void register(Observer obj) {if(obj == null) throw new NullPointerException("Null Observer");if(!observers.contains(obj)) observers.add(obj);}@Overridepublic void unregister(Observer obj) {observers.remove(obj);}@Overridepublic void notifyObservers() {List<Observer> observersLocal = null;//synchronization is used to make sure any observer registered after message is received is not notifiedsynchronized (MUTEX) {if (!changed)return;observersLocal = new ArrayList<>(this.observers);this.changed=false;}for (Observer obj : observersLocal) {obj.update();}}@Overridepublic Object getUpdate(Observer obj) {return this.message;}//method to post message to the topicpublic void postMessage(String msg){System.out.println("Message Posted to Topic:"+msg);this.message=msg;this.changed=true;notifyObservers();}}

注冊和注銷觀察者的方法實現非常簡單,額外的方法是postMessage() ,客戶端應用程序將使用該方法將String消息發布到主題。 請注意,布爾變量用于跟蹤主題狀態的變化,并用于通知觀察者。 此變量是必需的,這樣,如果沒有更新,并且有人調用notifyObservers()方法,它就不會向觀察者發送錯誤的通知。

還要注意在notifyObservers()方法中使用了同步 ,以確保僅將消息發送給在將消息發布到主題之前注冊的觀察者。

這是將監視該主題的Observers的實現。

package com.journaldev.design.observer;public class MyTopicSubscriber implements Observer {private String name;private Subject topic;public MyTopicSubscriber(String nm){this.name=nm;}@Overridepublic void update() {String msg = (String) topic.getUpdate(this);if(msg == null){System.out.println(name+":: No new message");}elseSystem.out.println(name+":: Consuming message::"+msg);}@Overridepublic void setSubject(Subject sub) {this.topic=sub;}}

請注意update()方法的實現,在此方法中它正在調用Subject getUpdate()方法來獲取要使用的消息。 我們可以通過將message作為參數傳遞給update()方法來避免此調用。

這是使用我們的主題實現的簡單測試程序。

package com.journaldev.design.observer;public class ObserverPatternTest {public static void main(String[] args) {//create subjectMyTopic topic = new MyTopic();//create observersObserver obj1 = new MyTopicSubscriber("Obj1");Observer obj2 = new MyTopicSubscriber("Obj2");Observer obj3 = new MyTopicSubscriber("Obj3");//register observers to the subjecttopic.register(obj1);topic.register(obj2);topic.register(obj3);//attach observer to subjectobj1.setSubject(topic);obj2.setSubject(topic);obj3.setSubject(topic);//check if any update is availableobj1.update();//now send message to subjecttopic.postMessage("New Message");}}

當我們運行上面的程序時,我們得到以下輸出。

Obj1:: No new message Message Posted to Topic:New Message Obj1:: Consuming message::New Message Obj2:: Consuming message::New Message Obj3:: Consuming message::New Message

觀察者模式類圖

觀察者模式也稱為發布-訂閱模式。 它的一些實現是;

  • Swing中的java.util.EventListener
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener

這就是Java中Observer模式的全部內容,希望您喜歡它。 通過評論和與他人分享來分享您的愛。

參考: Java的觀察者設計模式- 開發人員博客上來自我們JCG合作伙伴 Pankaj Kumar的示例教程 。

翻譯自: https://www.javacodegeeks.com/2013/08/observer-design-pattern-in-java-example-tutorial.html

總結

以上是生活随笔為你收集整理的Java中的观察者设计模式-示例教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。