歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java設計模式之---觀察者模式

Java觀察者模式,或叫做觀測者模式,說白了,就是對象間的一對多依賴,當一個對象的狀態發生改變時,它的所有依賴者都會收到通知並自動更新。

那麼我們可以定義以下三個接口:

主題接口,也就是被觀察的主題對象:

package observer;

public interface Subject {
 public void registerObserver(Observer o);
 public void removeObserver(Observer o);
 public void notifyObservers();
}

觀察者接口,當觀察者發現主題對象狀態改變時,要進行自身的更新:

package observer;

public interface Observer {
 public void update(double value);
}

顯示接口,被觀察的主題數據需要通過某種方式顯示出來:

package observer;

public interface Display {
 public void display();
}

為方便起見,我們舉例來講解。假設現在我們要觀察股市行情,那麼對於股市來說,所有股民的電腦或者股市行情的布告板就是它的觀察者,而股市本身就是一個被觀察的主題對象。

那麼我們可以很清楚的有下面幾個類的定義:

股市行情類,也就是此時真正被觀察的主題對象:

package observer;
import java.util.ArrayList;
public class StockQuotation implements Subject{

 private ArrayList<Observer> observers;
 private double stockvalue;
 
 public StockQuotation(){
  observers=new ArrayList<Observer>();
 }
 
 public void registerObserver(Observer o) {
  observers.add(o);
 }
 
 public void removeObserver(Observer o) {
  int i=observers.indexOf(o);
  if(i>=0){
   observers.remove(i);
  }
 }

 public void notifyObservers() {
  for(int i=0;i<observers.size();++i){
   Observer observer=(Observer) observers.get(i);
   observer.update(stockvalue);
  }
 }
 
 public void valueChanged(){
  notifyObservers();
 }
 
 public void setValue(double stockvalue){
  this.stockvalue=stockvalue;
  valueChanged();
 }
}

布告板類,用於顯示股市:

package observer;

public class BillBoard implements Observer, Display{

 private double stockvalue;
 private Subject stockQuotation;
 
 public BillBoard(Subject stockQuotation){
  this.stockQuotation=stockQuotation;
  stockQuotation.registerObserver(this);
 }
 
 public void display() {
  System.out.println("Current stock quotation: "+stockvalue);
 }

 public void update(double stockvalue) {
  this.stockvalue=stockvalue;
  display();
 }
 
 public void deleteThisDisplay(){
  this.stockQuotation.removeObserver(this);
 }
}

最後就是主類:

package observer;

public class Main {
 public static void main(String[] args){
  StockQuotation stockQuotation = new StockQuotation();
  BillBoard billBoard = new BillBoard(stockQuotation);
  stockQuotation.setValue(2099.9);
  billBoard.deleteThisDisplay();
  stockQuotation.setValue(2090.9);
 }
}

我們發現主類調用

billBoard.deleteThisDisplay();

之後布告板billBoard便不再是觀察者,所有它接收不到任何的股市行情了。

這樣的簡單代碼就實現了觀察者模式。

我們可以發現,當新類型的觀察者出現時,主題的代碼不需要修改。主題不在乎別的,只會發送通知給所有實現了觀察者接口的對象。

主題和觀察者之間松耦合,正是觀察者模式的獨到之處。

大話設計模式(帶目錄完整版) PDF+源代碼 http://www.linuxidc.com/Linux/2014-08/105152.htm

Java中介者設計模式 http://www.linuxidc.com/Linux/2014-07/104319.htm

Java 設計模式之模板方法開發中應用 http://www.linuxidc.com/Linux/2014-07/104318.htm

設計模式之 Java 中的單例模式(Singleton) http://www.linuxidc.com/Linux/2014-06/103542.htm

跟JBPM學習設計模式 http://www.linuxidc.com/Linux/2014-06/102861.htm

Copyright © Linux教程網 All Rights Reserved