博客 / 詳情

返回

觀察者模式

觀察者模式也被稱作“發佈-訂閲模式”,因此其對象之間是發佈和訂閲的角色。

在對象間定義一對多依賴,當一個對象的狀態改變,依賴它的對象收到通知並自動更新。

  • 抽象主題(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℃
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.