Java實現觀察者模式

觀察者,最簡單的來說就是,當被觀察者做出了某種舉動,觀察者能夠第一時間知道被觀察者做出的舉動。
舉個栗子:現在附近開了一家超市,但是呢!平常的時候都是有點小貴的,只有偶爾的時候才會有很便宜的東西,當然超市也知道,so,超市想著我想讓這附近的人都能夠第一時間知道我們超市某件商品降價了。此刻,超市就成了被觀察者,而周圍的人都成了觀察者。
超市具體要怎么做我就不知道了!
下面開始講的就是Java!

觀察者模式.png

圖可能畫的有點問題,虛線沒找到,等下次在改啊!汗!

圖上畫的是什么呢??
接口

Subject
Observable

Market
Observer

上面畫的還是很清楚的,但是我還是貼段代碼,看看Subject 是什么情況,就像圖上畫的那樣,三個方法,一個訂閱,一個取消,一個通知,

public interface Subject {

    void registerObservable(Observable observable);

    void removeObservable(Observable observable);

    void notifyObservable();
}

在看看Market里面有什么東西

public class Market implements Subject {

    private List<Observable> observableList = new ArrayList<>();

    private String goods;
    private BigDecimal price;

    public void updateGoods(String goods,BigDecimal price){
        this.goods = goods;
       this.price = price;
        notifyObservable();
    }

    public String getUpdateInfo(){
        return "商品名:"+goods+"\n價格"+price;
    }


    @Override
    public void registerObservable(Observable observable) {
        observableList.add(observable);
    }

    @Override
    public void removeObservable(Observable observable) {
        observableList.remove(observable);
    }

    @Override
    public void notifyObservable() {
        for(Observable observable:observableList){
            observable.update();
        }
    }
}

最最最重要的是Market中保存了所有的Observable,其實就是說作為商場,我知道有多少人給了我聯系方式,好通知周圍的小伙伴們。

之后的Observer 就簡單了,只要訂閱了商場,就能得到消息

public class Observer implements Observable {
    private Market market;
    public Observer(Market market){
        this.market = market;
     //most important 
       market.registerObservable(this);
    }
    @Override
    public void update() {
        System.out.println(getClass().getName()+market.getUpdateInfo());
    }
}

最后當然是貼上main函數的代碼以及運行時的結果咯

public class Main {
    public static void main(String[] args) {
        Market market = new Market();
        Observer observer = new Observer(market);
        market.updateGoods("牛肉", BigDecimal.valueOf(3.5));
        market.removeObservable(observer);
        market.updateGoods("牛肉", BigDecimal.valueOf(3.6));
        market.registerObservable(observer);
        market.updateGoods("牛肉", BigDecimal.valueOf(3.7));
    }
}
image.png

OK,that`s it.
如果覺得我寫的有什么問題!歡迎大家指正!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Basic Framework Subject:抽象主題(抽象被觀察者),抽象主題角色把所有觀察者對象保存在一個集...
    Pursuer96閱讀 349評論 0 1
  • 1 場景問題# 1.1 訂閱報紙的過程## 來考慮實際生活中訂閱報紙的過程,這里簡單總結了一下,訂閱報紙的基本流程...
    七寸知架構閱讀 4,688評論 5 57
  • 陽光 明媚,帶她去浪。 走他小時候走過的路 看他小時候留戀的風景 為什么瞧著他的背影會有點小孤單 還好以后有她陪伴...
    敏大王閱讀 211評論 1 0
  • 身為一個北方的姑娘在浙江生活了4年了,不能說北方和南方的生活體驗的很徹底,也差不多了,在北方是心理年齡不成熟雖然生...
    墻角一朵小花閱讀 654評論 0 0
  • Mac 終端命令大全 目錄操作 命令名功能描述使用舉例 mkdir創建一個目錄mkdir dirname rmdi...
    菜鳥2014閱讀 610評論 0 9