1.意圖
定義對象間的一種一對多的關係,當一個對象的狀態發生改變的時候,所有依賴
它的對象都得到通知。
2.參與者
Subject -目標知道它的觀察者
-提供註冊和刪除它的觀察者
Observer -爲那些在目標中發生改變時需獲得通知的對象
ConcreteSubject - 將有關狀態存入ConcreteObserver對象
- 當它的狀態發生改變的時候,通知它的觀察者
ConcreteObserver - 維護一個指向ConcreteSubject對象的引用
- 存儲相關的狀態,這些狀態和目標一致
- 實現Observer的更新接口使它的狀態和目標一致
3.結構
4.代碼
public interface Subject {
void register(Observer o);
void remove(Observer o);
}
public class ConcreteSubject implements Subject {
private String weather;
private List<Observer> list;
ConcreteSubject(){
list = new ArrayList<Observer>();
}
@Override
public void register(Observer o) {
list.add(o);
}
public void setWeather(String weather) {
this.weather = weather;
for(Observer o:list){
o.changWeather(weather);
}
}
@Override
public void remove(Observer o) {
list.remove(o);
}
}
public interface Observer {
void changWeather(String weather);
}
public class ConcreteObserver implements Observer {
private String weather;
private String name;
@Override
public void changWeather(String weather) {
setWeather(weather);
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Client {
public static void main(String[] args) {
ConcreteSubject weatherT = new ConcreteSubject();
ConcreteObserver o1 = new ConcreteObserver();
o1.setName("天氣預報臺1");
ConcreteObserver o2 = new ConcreteObserver();
o2.setName("天氣預報臺2");
ConcreteObserver o3 = new ConcreteObserver();
o3.setName("天氣預報臺3");
ConcreteObserver o4 = new ConcreteObserver();
o4.setName("天氣預報臺4");
weatherT.register(o1);
weatherT.register(o2);
weatherT.register(o3);
weatherT.register(o4);
weatherT.setWeather("北京氣溫零下5度,多晴轉雲");
System.out.println(o1.getName()+":"+o1.getWeather());
System.out.println(o2.getName()+":"+o2.getWeather());
System.out.println(o3.getName()+":"+o3.getWeather());
System.out.println(o4.getName()+":"+o4.getWeather());
}
}