JAVA設計模式 之 觀察者模式(JDK內置實現)

簡介:使用JAVA內置的幫你搞定觀察者模式。


1. 先把類圖放在這裏:

(1). Observable類追蹤所有的觀察者,並通知他們。

(2). Observer這個接口看起來很熟悉,它和我們之前寫的類幾乎一樣。

(3). WeatherData這就是我們以前所稱的“主題”Subject,從今以後也可以改稱爲“可觀察者”,我們不需要在提供Register(),remove(),notifyObservers()方法。因爲我們已經從超類繼承了這些行爲。


2. 如何把對象編程觀察者

如果以前一樣,實現觀察者接口(java.util.Observer),然後調用任何Observable對象的addObserver()方法,不想在當觀察者時,就調用deleteObserver()方法即可。


3. 可觀察者如何送出通知

首先,你需要利用擴展java.util.Observable接口產生“可觀察者”類,然後,需要兩個步驟:

第一:先調用setChanged()方法,標記狀態已經改變的事實。

第二:然後調用兩種nofityObservers()方法中的一個。

    notifyobservers() 或 notifyobservers(Object arg)   當通知時,arg參數爲參數將傳送給美一個觀察者對象。


4. 觀察者如何接收通知

同以前一樣,觀察者實現了更新的方法,但是方法的簽名不太一樣, 如:

    update(Observable o, Object arg)

(1). 將主題本身當做一個對象,好讓觀察者知道是哪個主題通知它的。

(2). 第二個參數就是傳入notityObservers()的數據對象,如果沒有說明爲空,如果你想“推”數據給觀察者對象就用該參數,否則觀察者就必須從可觀察者拉數據過來。


5. 代碼實現

(1)WeatherData.java類, 你可以看到它已經實現了Observable類。

package com.chengzhang.subject;

import java.util.Observable;

public class WeatherData extends Observable {
	
	private float temperatrue;
	
	private float humidity;
	
	private float pressure;
	
	public WeatherData(){};
	
	public void measurementsChanged(){
		setChanged();
		notifyObservers();
	}
	
	public float getTemperature(){
		return temperatrue;
	}
	
	public float getHumidity(){
		return humidity;
	}
	
	public float getPressure(){
		return pressure;
	}
	
	
	// 天氣發生變化
	public void setMeasurements(float temperature, float humidity, float pressure){
		this.temperatrue = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

}


(2). CurrentConditionsDisplay.java類

package com.chengzhang.subject;

import java.util.Observable;
import java.util.Observer;

public class CurrentConditionsDisplay implements Observer, Display {
	
	private Observable observable;
	
	private float temperature;
	
	private float pressure;
	
	private float humidity;
	
	public CurrentConditionsDisplay(Observable observable){
		this.observable = observable;
		this.observable.addObserver(this);
	}

	@Override
	public void update(Observable observable, Object obj) {
		if(observable instanceof WeatherData){
			WeatherData weatherData = (WeatherData)observable;
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			this.pressure = weatherData.getPressure();
			display();
		}
	}

	@Override
	public void display() {
		System.out.println("當前溫度:" + this.temperature);
		System.out.println("當期溼度:" + this.humidity);
		System.out.println("當期氣壓:" + this.pressure);
	}

}

(3). WeatherStation.java類

package com.chengzhang.subject;

public class WeatherStation {

	public static void main(String[] args) {
		
		WeatherData weatherData = new WeatherData();
		
		CurrentConditionsDisplay CurrentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
		
		weatherData.setMeasurements(23, 35, 12);
	}
	
}

(4). 輸出結果

當前溫度:23.0
當期溼度:35.0
當期氣壓:12.0


發佈了53 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章