1. 程式人生 > >觀察者模式(釋出/訂閱模式)

觀察者模式(釋出/訂閱模式)

  觀察者模式提供了避免元件之間緊密耦合的另一種方法,它將觀察者和被觀察者的物件分離開。在該模式中,一個物件通過新增一個方法(該方法允許另一個物件,即觀察者註冊自己)使本身變得可觀察。當可觀察的物件更改時,它會將訊息傳送到已註冊的觀察者。這些觀察者收到訊息後所執行的操作與可觀察的物件無關,這種模式使得物件可以相互對話,而不必瞭解原因。java語言與C#語言的時間處理機制就是採用此種設計模式。

例如,使用者介面(同一個資料可以有多種不同的顯示方式)可以作為觀察者,業務資料是被觀察者,當資料有變化後會通知介面,介面收到通知後,會根據自己的顯示方式修改介面的顯示方式。面向物件設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個物件只做一件事情,並且將它做好。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性。設計類圖如圖所示。

下面給出一個觀察者模式的示例程式碼,程式碼的主要功能是實現天氣預報,同樣的溫度資訊可以有多種不同的展示方式。

public interface Observer {
	//更新溫度
	public void update(float temp);
}
public interface Subject {
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
}

import java.util.ArrayList;

public class Whether implements Subject {
	private ArrayList<Observer>observers = new ArrayList<Observer>();
	private float temperature;
	@Override
	public void registerObserver(Observer o) {
		this.observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		this.observers.remove(o);
	}

	@Override
	public void notifyObservers() {
		for(int i=0;i<this.observers.size();i++){
			this.observers.get(i).update(temperature);
		}
	}
	
	public void whetherChange(){
		this.notifyObservers();
	}
	
	public float getTemperature(){
		return temperature;
	}
	
	public void setTemperature(float temperature){
		this.temperature =temperature;
		notifyObservers();
	}
}

public class WhetherDisplay1 implements Observer {
	private float temperature;
	public WhetherDisplay1(Subject whether){
		whether.registerObserver(this);
	}
	
	@Override
	public void update(float temp) {
		this.temperature=temp;
		display();
	}
	
	public void display(){
		System.out.println("display1****:"+this.temperature);
	}

}

public class WhetherDisplay2 implements Observer{
	private float temperature;
	public WhetherDisplay2(Subject whether){
		whether.registerObserver(this);
	}
	
	@Override
	public void update(float temp) {
		this.temperature=temp;
		display();
	}
	
	public void display(){
		System.out.println("display2----:"+this.temperature);
	}
 
}

public class Test {

	public static void main(String[] args) {
		Whether whether = new Whether();
		WhetherDisplay1 d1 = new WhetherDisplay1(whether);
		WhetherDisplay2 d2 = new WhetherDisplay2(whether);
		whether.setTemperature(27);
		whether.setTemperature(26);
	}
}