1. 程式人生 > >【Java】觀察者模式

【Java】觀察者模式

本文是《【C++】觀察者模式》(點選開啟連結)的Java實現,關於什麼是觀察者模式這裡就不將了,只是從類圖為視覺重新審視這條2014年上半年的軟體設計師的軟考題。

題目是這樣的:

某實驗室欲建立一個實驗室的環境監測系統,能夠顯示實驗室的溫度、溼度以及潔淨度等環境資料,當獲取到最新的環境測量資料時,顯示的環境資料能夠更新,現在採用觀察者(Observer)模式來開發該系統,觀察者模式的類圖如圖5-1所示:


程式碼還是在做一件通過修改具體主題類的類成員,達到自動更新具體觀察類的類成員事情。

從類圖可以看到ConcreteSubject與ConcreteObserver是分別實現Subject與Observer兩個介面的,因為其繼承線段是虛線。

同時觀察者與主題之間是關聯關係,也就是說在觀察者類中必有主題這個類成員,主題類中必有觀察者這個類成員。

而且觀察者是是通過register與interest來操作主題,主題則通過update來操作觀察者。

具體實現程式碼如下:

import java.util.*;
//介面
interface Observer{
	public void update(float temp,float humidity,float cleanness);
}
interface Subject{
	public void registerObserver(Observer o);//註冊對主題感興趣的觀察者
	public void removeObserver(Observer o);//刪除觀察者
	public void notifyObservers();//當主題發生變化時通知觀察者
}
//具體主題
class EnvironmentData implements Subject{
	private ArrayList<Observer> observers;
	private float temperature,humidity,cleanness;
	public EnvironmentData(){
		observers=new ArrayList<Observer>();
	}
	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
	}
	@Override
	public void removeObserver(Observer o) {
		observers.remove(o);
		
	}
	@Override
	public void notifyObservers() {
		for (int i = 0; i < observers.size(); i++) {
			Observer observer=(Observer)observers.get(i);
			observer.update(temperature, humidity, cleanness);//用於改變佇列中所有Observer的類成員
		}
	}
	//改變主題屬性的同時,將佇列中所有觀測者的類成員改變
	public void setMeasurements(float temperature,float humidity,float cleanness){
		this.temperature=temperature;
		this.humidity=humidity;
		this.cleanness=cleanness;
		notifyObservers();
	}
}
//具體觀察者
class CurrentConditionsDisplay implements Observer{
	private String NAME="觀察者1"; 
	private float temperature;
	private float humidity;
	private float cleanness;
	private Subject envData;
	public CurrentConditionsDisplay(Subject envData,String NAME) {//構造方法
		this.envData=envData;
		this.envData.registerObserver(this);//在主題的觀察者佇列中註冊自己
		this.NAME=NAME;
	}
	public void update(float temperature,float humidity,float cleanness){
		this.temperature=temperature;
		this.humidity=humidity;
		this.cleanness=cleanness;
	}
	public void display() {
		System.out.println("我是"+NAME+",現在的溫度是:"+temperature+",顯示的溼度是:"+humidity+",現在的潔淨度是:"+cleanness);		
	}
}


//主函式
public class EnvironmentMonitor {
	public static void main(String[] args) {
		EnvironmentData envData=new EnvironmentData();		
		CurrentConditionsDisplay currentDisplay1=new CurrentConditionsDisplay(envData,"觀察者1");
		CurrentConditionsDisplay currentDisplay2=new CurrentConditionsDisplay(envData,"觀察者2");
		envData.setMeasurements(80, 65, 30.4f);
		currentDisplay1.display();
		currentDisplay2.display();
	}

}


執行結果如下: