觀察者模式也被稱作“發佈-訂閲模式”,因此其對象之間是發佈和訂閲的角色。
在對象間定義一對多依賴,當一個對象的狀態改變,依賴它的對象收到通知並自動更新。
- 抽象主題(Subject)角色:也叫抽象目標類,它提供了一個用於保存觀察者對象的聚集類和增加、刪除觀察者對象的方法,以及通知所有觀察者的抽象方法。
- 具體主題(Concrete Subject)角色:也叫具體目標類,它實現抽象目標中的通知方法,當具體主題的內部狀態發生改變時,通知所有註冊過的觀察者對象。
- 抽象觀察者(Observer)角色:它是一個抽象類或接口,它包含了一個更新自己的抽象方法,當接到具體主題的更改通知時被調用。
- 具體觀察者(Concrete Observer)角色:實現抽象觀察者中定義的抽象方法,以便在得到目標的更改通知時更新自身的狀態。
抽象主題 - 天氣預報
public abstract class Weather {
Map<String,WebSite> map = new HashMap<>();
public void addWebSite(String name,WebSite webSite){
map.put(name,webSite);
}
public void removeWebsite(String name){
map.remove(name);
}
public abstract void publishMessage(String message);
}
具體主題 - 北京天氣
public class BeijingWeather extends Weather{
@Override
public void publishMessage(String message) {
Iterator<WebSite> iterator = map.values().iterator();
while (iterator.hasNext()){
iterator.next().postWeather(message);
}
}
}
抽象觀察者 - 網站
public interface WebSite {
void postWeather(String message);
}
具體觀察者 - 新浪、雅虎
public class Sina implements WebSite{
@Override
public void postWeather(String message) {
System.out.println("新浪天氣:"+message);
}
}
public class Yahoo implements WebSite{
@Override
public void postWeather(String message) {
System.out.println("Yahoo天氣:"+message);
}
}
測試
public class ObserverTest {
@Test
public void test(){
Weather weather = new BeijingWeather();
weather.addWebSite("sina",new Sina());
weather.addWebSite("yahoo",new Yahoo());
weather.publishMessage("北京多雲,23℃");
}
}
======結果======
Yahoo天氣:北京多雲,23℃
新浪天氣:北京多雲,23℃