觀察者模式

編程語言 程序員 Java java學習與交流 java學習與交流 2017-08-29

一:模式理解

  1. 觀察者模式也可以稱為訂閱者模式。

  2. 無論是觀察者還是訂閱者,關注的是主題的變化。

  3. 主題發生某些變化時,需要發生通知給所有的觀察者和訂閱者。

  4. 觀察者和訂閱者可以取消對主題的觀察或訂閱。

  5. 一些對象需要能感知到一個對象變了(做了某些操作)。假設只有一個主題。

二:例子

你是個富二代,家裡有很多僕人。

為了方便,只舉例三種,分別是程序員,老司機,女僕。

他們都繼承自Servant抽象類,並且都有跪舔的技能,即guitian方法。

觀察者模式

  1. 每個僕人都有一個fuErDai屬性,代表心中時刻都有主人。

  2. 並且在構造器中直接把自己作為富二代的僕人。

  3. 富二代比較民主,允許僕人們可以自主決定參加工作或是不幹了,分別對應add和remove方法。

  4. 不同僕人跪舔主人的方法不一樣,設置為抽象方法。

分別新建程序員,老司機,女僕三個類。

觀察者模式

作為富二代的你,也有一個對應的類,FuErDai。

觀察者模式

你有三個屬性,分別是僕人隊列,開心指數,健康指數。

有添加僕人和刪除僕人的方法。

在沒有觀察者模式之前,為了防止你不舒服了或是不開心了,僕人們隔三差五都需要來詢問一次。

僕人們發現每次走進你房間的時候,你總是對著藍天白雲的電腦桌面發呆。同時,你也覺得很不開心。

有了觀察者模式之後,當你的開心指數或者健康指數變化的時候,就會通知每個僕人,即notifyServants,每個僕人都會前來跪舔你。

觀察者模式

輸入/輸出:

表演敲代碼!

老司機開個車讓富二代開心開心!

如果你追到我,我就和你嘿嘿嘿!


老司機開個車讓富二代開心開心!

如果你追到我,我就和你嘿嘿嘿!

可以看到,當你健康指數變化的時候,所有僕人都會前來跪舔。

某天,程序員突然想起之前你答應帶他去徹夜鼓掌卻一直沒再提起,調用了remove方法,不再作為你的僕人。

在你的指數再次變化的時候,程序員將不會來跪舔。

三:再理解

  1. 在例子中,作為富二代的你就是主題,你的僕人們都是觀察者/訂閱者。

  2. 僕人們再也不用輪詢來檢查你的變化。

  3. 在通知僕人的方法notifyServants中,可以傳參,例子為方便沒傳遞參數。

  4. 在Java util包中有觀察者模式的實現。

  • 觀察者實現Observer接口,實現update方法;

  • 主題繼承Observable類,意思為可被觀察,底層用Vector<Observer> obs保存所有的觀察者,可做到多線程安全;

  • 在主題變化時,可調用setChanged()和notifyObservers()方法來通知觀察者,觀察者們執行update()方法;

  • 觀察者可通過調用addObserver(this)和deleteObserver(this)方法加入/退出主題的觀察者隊列。

5.Java util自帶Observable是個類,主題繼承這個類,就不能再繼承其他類,不利於擴展。

6.觀察者模式中,主題擁有一個觀察者列表,觀察者又引用了主題。

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群346942462,我們一起學Java!

相關推薦

推薦中...