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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

观察者模式Observer

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 观察者模式Observer 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

初學(xué)java的觀察者模式,今天總結(jié)了下,希望指正。

  觀察者模式定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象。

  這個(gè)主題對象在狀態(tài)上發(fā)生變化時(shí),會通知所有觀察者對象,讓它們能夠自動更新自己。

?

所謂觀察者模式,舉個(gè)例子現(xiàn)在許多購房者都密切觀察者房價(jià)的變化,當(dāng)房價(jià)變化時(shí),所有購房者都能觀察到,以上的購房者屬于觀察者,這便是觀察者模式。

???????Java中可以借助Observable類和Observer接口輕松實(shí)現(xiàn)以上功能。當(dāng)然此種模式的實(shí)現(xiàn)也不僅僅局限于采用這兩個(gè)類。

java.util.Observable中有兩個(gè)方法對Observer特別重要

1、setChanged()方法

/** 02. * Sets the changed flag for this {@code Observable}. After calling 03. * {@code setChanged()}, {@code hasChanged()} will return {@code true}. 04. */ 05.protected void setChanged() { 06. changed = true; 07.}


2、notifyObservers()方法 / notifyObservers(Object data)方法

/** 02. * If {@code hasChanged()} returns {@code true}, calls the {@code update()} 03. * method for every observer in the list of observers using null as the 04. * argument. Afterwards, calls {@code clearChanged()}. 05. * <p> 06. * Equivalent to calling {@code notifyObservers(null)}. 07. */ 08.public void notifyObservers() { 09. notifyObservers(null); 10.} 11. 12./** 13. * If {@code hasChanged()} returns {@code true}, calls the {@code update()} 14. * method for every Observer in the list of observers using the specified 15. * argument. Afterwards calls {@code clearChanged()}. 16. * 17. * @param data 18. * the argument passed to {@code update()}. 19. */ 20.@SuppressWarnings("unchecked") 21.public void notifyObservers(Object data) { 22. int size = 0; 23. Observer[] arrays = null; 24. synchronized (this) { 25. if (hasChanged()) { 26. clearChanged(); 27. size = observers.size(); 28. arrays = new Observer[size]; 29. observers.toArray(arrays); 30. } 31. } 32. if (arrays != null) { 33. for (Observer observer : arrays) { 34. observer.update(this, data); 35. } 36. } 37.} 以上兩個(gè)方法十分重要

setChanged()方法 ——

用來設(shè)置一個(gè)內(nèi)部標(biāo)志位注明數(shù)據(jù)發(fā)生了變化

notifyObservers()方法 / notifyObservers(Object data)方法 ——

通知所有的Observer數(shù)據(jù)發(fā)生了變化,這時(shí)所有的Observer會自動調(diào)用復(fù)寫好的update(Observable observable, Object data)方法來做一些處理(比如說畫面數(shù)據(jù)的更新)。

我們可以看到通知Observer有兩個(gè)方法,一個(gè)無參,一個(gè)有參。那么這個(gè)參數(shù)有什么作用呢?

其中一個(gè)作用:現(xiàn)在我不想通知所有的Observer,而只想其中一個(gè)指定的Observer做一些處理,那么就可以傳一個(gè)參數(shù)作為ID,然后在所有的Observer中判斷,每個(gè)Observer判斷只有接收到底參數(shù)ID是屬于自己的才做一些處理。

當(dāng)然參數(shù)還有其他作用,我只是舉了個(gè)例子。

注意: 只有在setChanged()被調(diào)用后,notifyObservers()才會去調(diào)用update(),否則什么都不干。

?????? 示例代碼如下:


import java.util.Observable; import java.util.Observer; class House extends Observable { private float price; public void setPrice(float price) { this.setChanged();// 設(shè)置變化點(diǎn) this.notifyObservers(price);// 通知所有觀察者價(jià)格改變 this.price = price; } public float getPrice() { return this.price; } public House(float price) { this.price = price; } public String toString() { return "房子價(jià)格為: " + this.price; } } class HousePriceObserver implements Observer { private String name; public HousePriceObserver(String name) { super(); this.name = name; } @Override public void update(Observable o, Object arg) {// 只要改變了 observable 對象就調(diào)用此方法 if (arg instanceof Float) { System.out.println(this.name + "觀察的價(jià)格更改為:" + ((Float) arg).floatValue()); } } } public class ObserTest { public static void main(String[] args) { House house = new House(1000000); HousePriceObserver hpo1 = new HousePriceObserver("購房者A"); HousePriceObserver hpo2 = new HousePriceObserver("購房者B"); HousePriceObserver hpo3 = new HousePriceObserver("購房者C"); house.addObserver(hpo1);// 給房子注冊觀察者 house.addObserver(hpo2);// 給房子注冊觀察者 house.addObserver(hpo3);// 給房子注冊觀察者 System.out.println(house.toString());//輸出房子價(jià)格 // 修改房子價(jià)格,會觸發(fā)update(Observable o, Object arg)方法通知購房者新的房價(jià)信息 house.setPrice(2222222);// System.out.println(house.toString());//再次輸出房子價(jià)格 } }

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。