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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

设计模式之-观察者模式(Observer Design Pattern)

發布時間:2024/9/5 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之-观察者模式(Observer Design Pattern) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當你訂閱一個感興趣主題消息,內容發生任何變化時都能夠得到通知,觀察者模式對你是非常有幫助的。在觀察者模式中,一個對象監控另一個對象的狀態,那這個對象被稱為觀察者,被監視的對象被稱為主題。

一個主題對象會有很多觀察者,當其內容發生改變時會通知所有觀察者。主題需提供是觀察者自身可以注冊(訂閱)和注銷(取消訂閱)方法,主題還包含一個方法來通知任何改變到所有的觀察者,使它可以發送更新通知,而觀察者也可以提供另一種方法來獲取更新。

Java提供了Observer模式的實現,通過java.util.Observable類和java.util.Observer接口實現Observer模式。但是它沒有被廣泛使用,因為實現是非常簡單的,大部分的時候,我們不會為了只是實現觀察者模式而輕易的去繼承一個類,因為Java不提供多重繼承。


Observer模式實現:

在這個例子中,我們只實現了一個簡單的主題以及觀察者可以進行訂閱功能。每當有新的消息發布到這個主題所有的觀察者都會被通知到并及時使用它們。

基本主題接口定義了基本方法,具體的主題子類去實現


Subject.java

package com.journaldev.design.observer; public interface Subject { ????//methods to register and unregister observers ????publicvoidregister(Observer obj); ????publicvoidunregister(Observer obj); ????? ????//method to notify observers of change ????publicvoidnotifyObservers(); ????? ????//method to get updates from subject ????publicObject getUpdate(Observer obj); ????? }

下一步,我們將建立Observer規則,將有一個方法用來設置符合觀察者感興趣內容和獲取主題更新內容方法

Observer.java

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); }
現在Observer規則已制定好,讓我們實現和處理我們的主題內容


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");synchronized (MUTEX) {if(!observers.contains(obj)) observers.add(obj);}}@Overridepublic void unregister(Observer obj) {synchronized (MUTEX) {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();}}

這里簡單實現了Obsever注冊與注銷,postMessage()方法用于更新主題消息,請注意,布爾變量作用,為保持在題目的狀態的變化的軌跡和在通知觀察者使用。這個變量是必需的,因此,如果沒有及時更新,有人呼吁notifyObservers()方法時,它不發送虛假通知給觀察者。

同時注意在notifyObservers()方法中使用了同步,用于確保該通知只發布給通知發布前注冊的observer


Observer實現觀察訂閱主題變化:

MyTopicSubscriber.java

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()方法它調用TopicgetUpdate()方法來獲取信息來實現。我們本來可以避免通過傳遞具體的消息作為參數傳遞給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


Observer Pattern Class Diagram



原文鏈接:http://www.journaldev.com/1739/observer-design-pattern-in-java


轉載于:https://www.cnblogs.com/happyxiaoyu02/p/6818943.html

總結

以上是生活随笔為你收集整理的设计模式之-观察者模式(Observer Design Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。

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