全面解析Java觀察者模式_java

來源:互聯網
上載者:User

【本文】

一、觀察者模式的定義:

簡單地說,觀察者模式定義了一個一對多的依賴關係,讓一個或多個觀察者對象監聽一個主題對象。這樣一來,當被觀察者狀態發生改變時,需要通知相應的觀察者,使這些觀察者對象能夠自動更新。例如:GUI中的事件處理機制採用的就是觀察者模式。

二、觀察者模式的實現:

Subject(被觀察的對象介面):規定ConcreteSubject的統一介面 ; 每個Subject可以有多個Observer;ConcreteSubject(具體被觀察對象):維護對所有具體觀察者的引用的列表 ;–狀態發生變化時會發送通知給所有註冊的觀察者。Observer(觀察者介面):規定ConcreteObserver的統一介面;定義了一個update()方法,在被觀察對象狀態改變時會被調用。ConcreteObserver(具體觀察者):維護一個對ConcreteSubject的引用;特定狀態與ConcreteSubject同步;實現Observer介面,update()方法的作用:一旦檢測到Subject有變動,就更新資訊。

圖表描述如下:

註:在被觀察者類中需要有一個集合維護所有觀察者。

三、舉例說明:

【方案一】:自己定義介面或者類來實現觀察者模式。

步驟如下:

(1)定義被觀察者所具有的介面:

package com.vince.observer;public interface Observable { //註冊為一個觀察者  public void registerObserver(Observer observer);  //取消觀察者  public void removeObserver(Observer observer);  //通知所有觀察者更新資訊  public void notifyObservers();}

(2)定義具體的被觀察者:杯子

package com.vince.observer;import java.util.Vector;public class Cup implements Observable{ //被觀察者維護的一個觀察者對象列表 private Vector<Observer> vector = new Vector<Observer>(); private float price;  public Cup(float price){  this.price = price; }  public float getPrice() {  return price; } public void setPrice(float price) {  //修改價格時,通知所有觀察者  this.price = price;  notifyObservers(); } @Override public void registerObserver(Observer observer) {  //註冊觀察者  vector.add(observer); } @Override public void removeObserver(Observer observer) {  //取消觀察者  vector.remove(observer); } @Override public void notifyObservers() {  //實現通知所有的觀察者對象  for (Observer observer:vector) {   observer.update(price);  } }}

(3)定義觀察者所具有的共同的介面:(更新資料最終當然是在觀察者那裡進行啦)

package com.vince.observer;public interface Observer {  public void update(float price);5 }

(4)定義具體的觀察者對象:

package com.vince.observer;public class Person implements Observer{ private String name; public Person(String name){  this.name = name; } @Override public void update(float price) {  System.out.println(name+"關注的杯子的價格已更新為:"+price); }}

(5)測試:

package com.vince.observer;public class Test { public static void main(String[] args) {  //建立一個被觀察者對象  Cup doll = new Cup(3000);  //建立兩個觀察者對象  Person p1 = new Person("生命壹號");  Person p2 = new Person("生命貳號");  //註冊成為一個觀察者  doll.registerObserver(p1);  doll.registerObserver(p2);    System.out.println("第一輪促銷:");  doll.setPrice(2698);// 價格變動  System.out.println("第二輪促銷:");  doll.setPrice(2299);//  System.out.println("第三輪促銷:");  doll.setPrice(1998);    doll.removeObserver(p2); //將生命二號移除  System.out.println("第四輪促銷:");  doll.setPrice(1098);     }}

運行後,顯示結果如下:

【方案二】:直接調用JDK的API去實現。

步驟如下:

(1) 通過繼承Observable類實現具體的被觀察者對象:

package com.vince.observer2;import java.util.Observable;public class Cup extends Observable{ private float price;  public Cup(float price){  this.price = price; } public float getPrice() {  return price; } public void setPrice(float price) {  this.price = price;  this.setChanged();//通知,資料已改變  this.notifyObservers(); }  }

(2)通過實現java.util.Observer介面實現具體的觀察者對象:

package com.vince.observer2;import java.util.Observable;import java.util.Observer;public class Person implements Observer{ private String name; public Person(String name){  this.name = name; } @Override public void update(Observable o, Object arg) {  if(o instanceof Cup){   Cup cup = (Cup)o;   System.out.println(name+"關注的杯子價格已更新為:"+cup.getPrice());  } }}

(3)測試:

package com.vince.observer2;public class Test { public static void main(String[] args) {  Cup cup = new Cup(3000);  Person p1 = new Person("生命壹號");  Person p2 = new Person("生命貳號");  cup.addObserver(p1);  cup.addObserver(p2);  System.out.println("第一輪促銷");  cup.setPrice(2988);  System.out.println("第二輪促銷");  cup.setPrice(2698);    cup.deleteObserver(p2);  System.out.println("第三輪促銷");  cup.setPrice(1998); }}

運行後,結果如下:

【工程檔案】

連結:http://xiazai.jb51.net/201609/yuanma/JavaSEguancha(jb51.net).rar

四、總結:(觀察者模式的作用)

觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表。

由於被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬於不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個對象必然跨越抽象化和具體化層次。

觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.