觀察者(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模型進行具體的代碼實現,如圖:[**附源碼**](http://download.csdn.net/detail/jave_lover/8000095)

- 前言
- (一)策略模式建模與實現
- (二)觀察者模式建模與實現
- (三)裝飾者模式建模與實現
- (四)工廠方法模式建模與實現
- (五)抽象工廠模式建模與實現
- (六)單例模式建模與實現
- (七)命令模式建模與實現
- (八)適配器模式建模與實現
- (九)外觀模式建模與實現
- (十)模板方法模式建模與實現
- (十一)迭代器模式建模與實現
- (十二)組合模式建模與實現
- (十三)狀態模式建模與實現
- (十四)代理模式建模與實現
- (十五)建造者模式建模與實現
- (十六)原型模式建模與實現
- (十七)橋接模式建模與實現
- (十八)責任鏈模式建模與實現
- (十九)備忘錄模式建模與實現
- (二十)解釋器模式建模與實現
- (二十一)享元模式建模與實現
- (二十二)中介者模式建模與實現
- (二十三)訪問者模式建模與實現
- Java設計模式博客全目錄