成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java設計模式之觀察者模式詳解

dayday_up / 935人閱讀

摘要:觀察者模式,是一對多的關系,一個主題對應多個觀察者,當這個主題發(fā)生變化的時候,所有觀察著這個主題的觀察者都會接收到通知來獲悉主題的變化。這就是使用的觀察者模式,下面就讓我們用代碼實現(xiàn)觀察者模式。

觀察者模式,是一對多的關系,一個主題對應多個觀察者,當這個主題發(fā)生變化的時候,所有觀察著這個主題的觀察者都會接收到通知來獲悉主題的變化。

在現(xiàn)實中我們也會遇到許許多多應用觀察者模式的行為,比如電視的節(jié)目頻道里有時候會有暴雨天氣的標志,這個標志是會隨著天氣的變化來顯示,而我們顯示的也是最新的天氣標志,在這里電視頻道就相當于是一個主題,而我們的電視機就是這個主題觀察者,所以當這個天氣標志有變化時電視上的畫面也隨著變化。這就是使用的觀察者模式,下面就讓我們用代碼實現(xiàn)觀察者模式。

首先我們需要定義主題的接口,這里面有三個方法,registerObserver、removeObserver和notifyObserver,分別是用來添加觀察者、去除觀察者和通知所有觀察者。其中dataChange方法是只要當數(shù)據(jù)有變化就會被調(diào)用,我們需要在這個方法里調(diào)用notifyObserver去通知所有的觀察者數(shù)據(jù)變化的內(nèi)容,這里我們使用setSimulateDataChange方法來模擬數(shù)據(jù)的變化。

public interface Subject {

    void registerObserver(Observer observer);

    void removeObserver(Observer observer);

    void notifyObserver();
}

然后我們創(chuàng)建一個具體的主題類來實現(xiàn)這個主題接口,假設這個類是獲取電視頻道的信息。在這個類里面我們需要創(chuàng)建一個集合用來存取觀察這個主題的所有觀察者,接口中的registerObserver和removeObserver方法實際就是對集合的增刪操作,而notifyObserver方法其實就是遍歷集合通知所有的對象。

public class TelevisionData implements Subject {
    private String showName;
    private String showType;
    private ArrayList list;

    public TelevisionData(){
        list = new ArrayList();
    }

    @Override
    public void registerObserver(Observer observer) {
        list.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        int index = list.indexOf(observer);
        if (index>=0){
            list.remove(index);
        }
    }

    @Override
    public void notifyObserver() {
        ListIterator listIterator = list.listIterator();
        while (listIterator.hasNext()){
        Observer observer = (Observer)listIterator.next();
            observer.update(showName,showType);
        }
    }

    public void dataChange(){
        notifyObserver();
    }

    //此方法用于模擬控制數(shù)據(jù)的更新,數(shù)據(jù)更新后會調(diào)用dataChange方法
    public void setSimulateDataChange(String showName,String showType){
         this.showName = showName;
         this.showType= showType;
         dataChange();
    }
}

主題部分的代碼寫好了,接著我們需要寫觀察者的代碼,電視節(jié)目都播放在電視上,那我們把創(chuàng)建的電視類抽取出一個show方法放在Display接口中。

public interface Display {
    void show();
}

另外觀察者還有一個共性,就是要接收更新到的數(shù)據(jù)進行更新,所以我們再抽取出一個update方法放到Obeserver接口中。

public interface Observer {
    void update(String showName,String showNum);
}

最后我們創(chuàng)建觀察者的類來實現(xiàn)這兩個接口,在這個類中showName和showType字段是用來接收主題的數(shù)據(jù)的,而subject則是要關注的主題類型引用,通過這個引用我們就可以調(diào)用registerObserver和removeObserver來控制觀察者是否還要觀察這個主題。當主題更新時則會調(diào)用update方法,觀察者獲取到更新的數(shù)據(jù)就再調(diào)用show方法顯示出來。

public class John implements Observer,Display {
    private Subject subject;
    private String showName;
    private String showType;

    public John(Subject subject){
        this.subject = subject;
    }

    @Override
    public void show() {
        System.out.println("john收看的當前天氣類型-" + showType);
        System.out.println("john收看的當前天氣級別-" + showName);
    }

    @Override
    public void update(String showName,String showType) {
        this.showName = showName;
        this.showType = showType;
        show();
    }

    public void registerObserver(){
        this.subject.registerObserver(this);
    }


    public void removeObserver(){
        this.subject.removeObserver(this);
    }
}

public class Jack implements Observer,Display {
    private Subject subject;
    private String showName;
    private String showType;

    public Jack(Subject subject){
        this.subject = subject;
    }

    @Override
    public void show() {
        System.out.println("jack收看的當前天氣類型-" + showType);
        System.out.println("jack收看的當前天氣級別-" + showName);
    }

    @Override
    public void update(String showName,String showType) {
        this.showName = showName;
        this.showType = showType;
        show();
    }

    public void registerObserver(){
        this.subject.registerObserver(this);
    }


    public void removeObserver(){
        this.subject.removeObserver(this);
    }

}

下面我們來測試一下

//創(chuàng)建一個主題
televisionData = new TelevisionData();
    
//添加觀察者
John john = new John(televisionData);
john.registerObserver();
Jack jack = new Jack(televisionData);
jack.registerObserver();
        
//模擬數(shù)據(jù)更新
changeData("大風", "5級");
changeData("暴雨", "紅色");
    
public static void changeData(String showName, String showType) {
    televisionData.setSimulateDataChange(showName,showType);
}

結(jié)果:
john收看的當前天氣類型-紅色
john收看的當前天氣級別-暴雨
jack收看的當前天氣類型-紅色
jack收看的當前天氣級別-暴雨
john收看的當前天氣類型-5級
john收看的當前天氣級別-大風
jack收看的當前天氣類型-5級
jack收看的當前天氣級別-大風

我們再試著去掉一個觀察者看它還會不會收到更新,結(jié)果是不會收到更新了

changeData("暴雨", "紅色");
john.removeObserver();
changeData("大風", "5級");

結(jié)果:
john收看的當前天氣類型-紅色
john收看的當前天氣級別-暴雨
jack收看的當前天氣類型-紅色
jack收看的當前天氣級別-暴雨
jack收看的當前天氣類型-5級
jack收看的當前天氣級別-大風

總結(jié):
觀察者模式的大致原理其實就是觀察者持有主題的引用來控制主題內(nèi)部的集合對自己增刪從而控制是否關注這個主題,而主題則通過對集合中的對象的操作,把數(shù)據(jù)的更新通知給所有的觀察者。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69059.html

相關文章

  • Java學習路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強)

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評論0 收藏0
  • 扔物線:給 Android 開發(fā)者的 RxJava 詳解

    摘要:觀察者模式面向的需求是對象觀察者對對象被觀察者的某種變化高度敏感,需要在變化的一瞬間做出反應。規(guī)定,當不會再有新的發(fā)出時,需要觸發(fā)方法作為標志。在事件處理過程中出異常時,會被觸發(fā),同時隊列自動終止,不允許再有事件發(fā)出。 我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 項目也在使用 RxJava ,并且使...

    tianren124 評論0 收藏0
  • 慕課網(wǎng)_《模式的秘密察者模式》學習總結(jié)

    摘要:時間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學源碼學習源碼第一章觀察者模式概述課程簡介觀察者模式的定義定義對象間的一種一對多的依賴關系。 時間:2017年08月29日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/z...

    iKcamp 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<