如果想要實作觀察者模式,則必須依靠java.util包中提供的Observable類和Observer接口
觀察者設計模式
現在很多的購房者都在關注着房子的價格變化,每當房子價格變化的時候,所有的購房者都可以觀察得到。
實際上以上的購房者就是觀察者,他們所關注的房價就是被觀察者
其中要求,被觀察者需要繼承Observable類,觀察則需要實作Observer接口
具體實作如下
房價的實作
1 class House extends Observable{
2 private double price;
3 public House(double price){
4 this.price=price;
5 }
6 public double getPrice(){
7 return price;
8 }
9 public void setPrice(double price){
10 if(this.price!=price){
11 this.price=price;
12 setChanged(); //标注價格已經被更改
13 this.notifyObservers(price); //通知觀察者資料已被更改
14 }
15 }
16 @Override
17 public String toString() {
18 return "目前房價為:"+price;
19 }
20 }
購房者實作
1 class HousePriceObserver implements Observer{
2 private String name;
3 public HousePriceObserver(String name) {
4 this.name=name;
5 }
6 @Override
7 public void update(Observable o, Object arg) {
8 //這裡最好判斷一下通知是否來自于房價,有可能來自其它地方
9 if(o instanceof House){
10 System.out.println("購物者"+name+ "觀察到房價已調整為:"+arg);
11 }
12 }
13 }
運作
1 House house=new House(10000);
2 HousePriceObserver A=new HousePriceObserver("A");
3 HousePriceObserver B=new HousePriceObserver("B");
4 HousePriceObserver C=new HousePriceObserver("C");
5 house.addObserver(A);
6 house.addObserver(B);
7 house.addObserver(C);
8 System.out.println(house);
9 house.setPrice(6000);
10 house.setPrice(8000);
運作結果為:
目前房價為:10000.0
購物者C觀察到房價已調整為:6000.0
購物者B觀察到房價已調整為:6000.0
購物者A觀察到房價已調整為:6000.0
購物者C觀察到房價已調整為:8000.0
購物者B觀察到房價已調整為:8000.0
購物者A觀察到房價已調整為:8000.0