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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

事件驱动之JDK观察者模式

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事件驱动之JDK观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDK中關于觀察者模式主要了解倆個概念

  • Observer觀察者
  • Observable事件源;當事件源發生某事件時,有兩個事情需要注意 1.里面有一個isChange屬性? 當為false時不會發通知給觀察者。所以一般先setChange為true,然后注冊觀察者,再調用notifyObservers方法? 通知所有觀察者中的update方法
  • 代碼:

    定義一個觀察者:

    public class EmailObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {if (o instanceof PaymentStatusObservable) {System.out.println("更新訂單事件源");}System.out.println("郵件服務搜到通知..." + arg);}}

    定義一個事件源

    /** *此類表示模型視圖范例中的 observable 對象,或者說“數據”??蓪⑵渥宇惢?#xff0c;表示應用程序想要觀察的對象。一個 observable 對象可以有一個或多個觀察者。觀察者可以是實現了 Observer 接口的任意對象。一個 observable 實例改變后,調用 Observable 的 notifyObservers 方法的應用程序會通過調用觀察者的 update 方法來通知觀察者該實例發生了改變。未指定發送通知的順序。Observable 類中所提供的默認實現將按照其注冊的重要性順序來通知 Observers,但是子類可能改變此順序,從而使用非固定順序在單獨的線程上發送通知,或者也可能保證其子類遵從其所選擇的順序。注意,此通知機制與線程無關,并且與 Object 類的 wait 和 notify 機制完全獨立。新創建一個 observable 對象時,其觀察者集是空的。當且僅當 equals 方法為兩個觀察者返回 true 時,才認為它們是相同的。<P>注意點: Observable實現了大部分的邏輯,沒有很好地進行抽象,靈活性降低了存在2個潛在的問題:一個剛剛加入的觀察者錯過了通知;一個剛剛刪除的觀察者被錯誤的通知Observable實現的方法采用synchronized,操作同一個方法時串行,可能會存在效率問題*/ public class PaymentStatusObservable extends Observable {public void updatePaymentStatus(int status) {System.out.println("更新支付狀態為:" + status);this.setChanged();/*** 如果 hasChanged 方法指示對象已改變,則通知其所有觀察者,并調用 clearChanged 方法來指示此對象不再改變。每個觀察者都有其 update 方法,其調用參數有兩個:observable 對象和 null。換句話說,此方法等效于:notifyObservers(null)*/this.notifyObservers();


    ?public void notifyObservers(Object arg) {

    ? ? ? ? /*

    ?? ? ? ? * a temporary array buffer, used as a snapshot of the state of

    ?? ? ? ? * current Observers.

    ?? ? ? ? */

    ? ? ? ? Object[] arrLocal;

    ?

    ? ? ? ? synchronized (this) {

    ? ? ? ? ? ? /* We don't want the Observer doing callbacks into

    ?? ? ? ? ? ? * arbitrary code while holding its own Monitor.

    ?? ? ? ? ? ? * The code where we extract each Observable from

    ?? ? ? ? ? ? * the Vector and store the state of the Observer

    ?? ? ? ? ? ? * needs synchronization, but notifying observers

    ?? ? ? ? ? ? * does not (should not).? The worst result of any

    ?? ? ? ? ? ? * potential race-condition here is that:

    ?? ? ? ? ? ? * 1) a newly-added Observer will miss a

    ?? ? ? ? ? ? * ? notification in progress

    ?? ? ? ? ? ? * 2) a recently unregistered Observer will be

    ?? ? ? ? ? ? * ? wrongly notified when it doesn't care

    ?? ? ? ? ? ? */

    ? ? ? ? ? ? if (!changed)

    ? ? ? ? ? ? ? ? return;

    ? ? ? ? ? ? arrLocal = obs.toArray();//得到事先加入的vector的觀察者

    ? ? ? ? ? ? clearChanged();

    ? ? ? ? }

    ?

    ? ? ? ? for (int i = arrLocal.length-1; i>=0; i--)

    ? ? ? ? ? ? ((Observer)arrLocal[i]).update(this, arg);//更新觀察者的update方法

    ? ? }

    } }

    demo:

    public class ClientDemo {public static void main(String[] args) {// 被觀察者。即事件源PaymentStatusObservable paymentStatusObservable = new PaymentStatusObservable();// 如果觀察者與集合中已有的觀察者不同,則向對象的觀察者集中添加此觀察者paymentStatusObservable.addObserver(new EmailObserver());

    /**
    *源碼解析

    ? public synchronized void addObserver(Observer o) {

    ? ? ? ? if (o == null)

    ? ? ? ? ? ? throw new NullPointerException();

    ? ? ? ? if (!obs.contains(o)) {

    ? ? ? ? ? ? obs.addElement(o);

    ? ? ? ? }

    ? ? }


    */paymentStatusObservable.updatePaymentStatus(
    1);} }

    outPut:

    更新支付狀態為:1

    更新訂單事件源

    郵件服務搜到通知...null

    ?

    ?

    ?

    轉載于:https://www.cnblogs.com/zhangfengshi/p/9397519.html

    總結

    以上是生活随笔為你收集整理的事件驱动之JDK观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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