Java設計模式菜鳥系列(二)觀察者模式建模與實現

轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/39755577


觀察者(Observer)模式定義:在對象之間定義了一對多的依賴關係,這樣一來,當一個對象改變狀態時,依賴它的對象都會收到通知並自動跟新。Java已經提供了對觀察者Observer模式的默認實現, Java對觀察者模式的支持主要體現在Observable類和Observer接口。先看uml模型圖:


一、UML模型圖


二、代碼實現

/** 示例:咱們去菜市場買菜
 * 
 * 小商販--主題
 */
class Food extends Observable {
	/** 菜名 */
	private String name;
	/** 菜價 */
	private float price;

	public Food(String name, float price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
		/**
		 * 設置菜價的狀態已經被改變
		 */
		this.setChanged();
		/**
		 * 通知【所有】正在看菜(已經註冊了)的顧客,然後回調Observer的update方法進行更新
		 * 
		 * 這裏可以體現對象的一對多:一個小商販一旦更新價格(即一個對象改變狀態),便會自動通知所有的顧客(依賴它的對象都會收到通知)
		 * 並自動update
		 */
		this.notifyObservers(price);
	}

}

/**
 * 顧客 --觀察者
 */
class Customer implements Observer {
	private String name;

	public Customer(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	@Override
	public void update(Observable o, Object arg) {
		if (o instanceof Food && arg instanceof Float) {
			Food food = (Food) o;
			float price = (Float) arg;
			System.out.println("您好:" + this.name + " ," + food.getName()
					+ "的價格已經發生改變,現在的價格爲:" + price + "元/斤");
		}
	}

}

/**
 * 客戶端測試類
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Food food = new Food("土豆", 1.0f);
		Customer zhangsan = new Customer("張三");
		Customer lisi = new Customer("李四");
		/**
		 * 添加顧客
		 */
		food.addObserver(zhangsan);
		food.addObserver(lisi);
		/**
		 * 更新價格
		 */
		food.setPrice(1.5f);
	}
}

三、應用場景

GUI框架、氣象觀察等


四、小結

在通知所有觀察者之前一定要調用 setChanged()方法來設置被觀察者的狀態已經被改變,這樣notifyObservers()纔會回調Observer的update方法進行更新。

以上內容如果有不同的見解或疏忽的地方,還請大家提出寶貴的建議或意見。

最後大家可以試着將下面的uml模型進行具體的代碼實現,如圖:附源碼



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章