設計模式-行爲型之觀察者(observer)模式

定義

  • 當被觀察者發生變化時,通知觀察者。

使用場景

  • 發佈訂閱。不同的客戶端關注同一消息。
  • 比如我們手機訂閱的新聞,微信公衆號推文等。

UML圖

在這裏插入圖片描述

代碼實現

// 被觀察者(通知者)
public class Observable {

    //充當信息
    private int num;

    private List<Observer> observerList ;

    public Observable(List<Observer> observerList,int num) {
        this.observerList = observerList;
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    //註冊觀察者
    public void addObserver(Observer o){
        if(o != null && !observerList.contains(o)){
            observerList.add(o);
        }
    }

    //移除觀察者
    public void removeObserver(Observer o){
        observerList.remove(o);
    }

    //發送通知所有觀察者
    public void notifyObservers(){
        Iterator<Observer> iterator = observerList.iterator();
        while (iterator.hasNext())
            iterator.next().update(this);
    }
}
//觀察者(被通知者)
public interface Observer {
    //接收通知
    public void update(Observable observable);
}
// 具體的觀察者
public class NumBerObserver implements Observer {
    @Override
    public void update(Observable observable) {
        int num = observable.getNum();
        System.out.println(num);
    }
}
// 具體的觀察者
public class ShapeObserver implements Observer {
    @Override
    public void update(Observable observable) {
        int num = observable.getNum();
        for (int i=0;i<num;i++)
            System.out.print("*");
    }
}
// 測試
public class Client {
    public static void main(String[] args) {
        Observable observable = new Observable(new ArrayList<>(),5);
        Observer observer = new NumBerObserver();
        ShapeObserver shapeObserver = new ShapeObserver();
        observable.addObserver(observer);
        observable.addObserver(shapeObserver);
        observable.notifyObservers();
    }
}

總結

  • 被觀察者給觀察者發送通知。
  • 例子中觀察者的 update 方法中接收 Observable ,因爲java是單繼承,當被觀察者已經繼承了某一個類,則這裏就不適用了(java源碼包中就是這種,所以不是很好用),所以通常我們將 Observable 定義爲一個接口更合適。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章