Java設計模式-觀察者模式。

今天給大家帶來一個同樣比較簡單的設計模式,觀察者模式,首先我們來看一下定義:在對象之間定義了一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象會收到通知并自動更新。
根據這個定義,我們可以看出,主要分為兩個部分,第一個是觀察者,第二個是被觀察者。為一對多的關系,當被觀察者做出改變的時候,觀察者們可以觀察到這個變化。比較容易理解的例子就是我們的公眾號,公眾號就是被觀察者,用戶就是觀察者,當公眾號發表文章的時候,我們每個關注了的用戶都能立即收到。我們進行分析,公眾號主要有三個功能,分別為,關注、取消關注、推送消息。用戶只有在關注了之后,才能在公眾號做消息推送的時候進行接收。我們來書寫一下這個被觀察者的超類。

//被觀察者
public interface Observerable<T>{
    //訂閱
     public  void subscribe(Observer<T> observer);
     //取消訂閱
     public  void unSubscribe(Observer<T> observable);
     //告知觀察者數據改變
     public  void notifyObserver(T t);
}

我們的用戶比較簡單提供一個方法來讓公眾號告知改變了什么數據。我們來書寫一下超類。

//觀察者
public interface  Observer<T> {
    public void updata(T data);
}

接下來我們來進行具體的實現

public class WeChatServer<T> implements Observerable<T> {
    public List<Observer<T>> observers  ;

    public WeChatServer(){
        observers = new ArrayList<>();
    }
    @Override
    public void subscribe(Observer<T> observer) {
        if(observer!= null && !observers.contains(observer)){
            observers.add(observer);
        }else if(observer == null){
            throw new IllegalArgumentException("observer is null");
        }
    }

    @Override
    public void unSubscribe(Observer<T> Observer) {
        if(!observers.isEmpty()){
            observers.remove(Observer);
        }
    }

    @Override
    public void notifyObserver(T t) {
        for(int i = 0; i < observers.size(); i++) {
            Observer oserver = observers.get(i);
            oserver.updata(t);
        }
    }
    //設置數據
    public void setData(T data){
        notifyObserver(data);
    }
}

被觀察者提供subscribe方法將觀察者放在一個統一的集合當中,主要目的就是在數據改變時,找到所有關注了的用戶,告知數據發生了改變。我們可以在notifyObserver方法中看到具體實現。setData方法提供的是改變公眾號內容的方法。我們再來實現一下用戶部分。

public class User implements Observer<String> {
    private String name;
    private int age;
    public User(String name, int age){
        this.name = name;
        this.age = age ;
    }

    @Override
    public void updata(String data) {
        System.out.println("我是"+name+",我收到了消息data:="+data);
    }
}

我們實現updata方法接收到公眾號的更新。并打印更新信息,我們來測試一下。

    public static void main(String args[]){
        WeChatServer<String> observerable = new WeChatServer<>();

        Observer<String> observer1  = new User("張三",18);
        Observer<String> observer2  = new User("李四",31);
        Observer<String> observer3  = new User("王武",11);
        Observer<String> observer4 = new User("玉剛",30);
        observerable.subscribe(observer1);
        observerable.subscribe(observer2);
        observerable.subscribe(observer3);
        observerable.subscribe(observer4);
        observerable.setData("新聞1");
        observerable.unSubscribe(observer2);
        System.out.println("李四退訂");
        observerable.setData("新聞2");
    }
//結果
我是張三,我收到了消息data:=新聞1
我是李四,我收到了消息data:=新聞1
我是王武,我收到了消息data:=新聞1
我是玉剛,我收到了消息data:=新聞1
李四退訂
我是張三,我收到了消息data:=新聞2
我是王武,我收到了消息data:=新聞2
我是玉剛,我收到了消息data:=新聞2

我們可以看到 我們創建了4個用戶分別訂閱了公眾號。都能收到公眾號的新聞,當李四退訂之后,公眾號發的新聞就收不到了。完全符合對觀察者模式的定義:在對象之間定義了一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象會收到通知并自動更新。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370