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

資訊專欄INFORMATION COLUMN

觀察者模式

flybywind / 2850人閱讀

摘要:觀察者模式定義了對(duì)象之間的一對(duì)多依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴者都會(huì)收到通知并自動(dòng)更新。所有的觀察者只需要保有一個(gè)對(duì)象的引用,便可以在各自的構(gòu)造器中實(shí)現(xiàn)對(duì)自身的注冊(cè)。

觀察者模式定義了對(duì)象之間的一對(duì)多依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴者都會(huì)收到通知并自動(dòng)更新。

這就好比一個(gè)辦在線教育的老師(OnlineTeacher)和線下的若干學(xué)生(localStudent1, localStudent2, localStudent3 ...)之間的關(guān)系。

當(dāng)這個(gè)老師在線上發(fā)布了一條消息之后,他所有的學(xué)生都會(huì)收到通知,并可以根據(jù)這條消息的內(nèi)容來(lái)實(shí)現(xiàn)對(duì)應(yīng)的更新。

觀察者模式類圖

為了實(shí)現(xiàn)松耦合設(shè)計(jì),OnlineTeacher對(duì)象只需要實(shí)現(xiàn)Subject接口,并實(shí)現(xiàn)其中規(guī)定的三個(gè)方法即可:

registerObserver(); //注冊(cè)觀察者

removeObserver(); //取消注冊(cè)觀察者

notifyObserver(); //通知觀察者

Subject接口:
public interface Subject {
    //Subject接口中的三個(gè)方法,用于注冊(cè)、移除和通知observers
    void registerObserver(Observer observer);

    void removeObserver(Observer observer);
    //以上兩個(gè)方法都需要一個(gè)observer對(duì)象作為變量,以實(shí)現(xiàn)注冊(cè)或被刪除

    void notifyObservers();
}

同時(shí),OnlineTeacher對(duì)象還需要一個(gè)數(shù)據(jù)結(jié)構(gòu),來(lái)存儲(chǔ)已經(jīng)注冊(cè)的學(xué)生對(duì)象。

OnlineTeacher類
public class OnlineTeacher implements Subject {
    //建立一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)注冊(cè)過(guò)的observer對(duì)象
    private ArrayList observerArrayList;
    //用message來(lái)模擬老師講課
    private String message;

    //OnlineTeacher類的構(gòu)造器,生成該對(duì)象時(shí),會(huì)初始化一個(gè)observerArrayList
    public OnlineTeacher() {
        observerArrayList = new ArrayList<>();
    }

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

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

    //實(shí)現(xiàn)notifyObservers(),實(shí)質(zhì)上就是遍歷observerArrayList,讓其中的每一個(gè)observer對(duì)象調(diào)用他們的update()方法
    @Override
    public void notifyObservers() {
        for (int i = 0; i < observerArrayList.size(); i++) {
            observerArrayList.get(i).updates(message);
        }
    }

    //OnlineTeacher有一個(gè)方法,setMessage()
    public void setMessage(String newMessage) {
        this.message = newMessage;
        messageChanged(); //message賦值之后,調(diào)用messageChanged()方法
    }

    //還有一個(gè)方法,messageChanged,在此方法中調(diào)用notifyObservers()
    public void messageChanged() {
        notifyObservers();
    }
}

而所有的學(xué)生對(duì)象只需要實(shí)現(xiàn)Observer接口即可成為“觀察者”。
所有的觀察者只需要保有一個(gè)OnlineTeacher對(duì)象的引用,便可以在各自的構(gòu)造器中實(shí)現(xiàn)對(duì)自身的注冊(cè)。

Observer接口
public interface Observer {

    void updates(String message);
}
用來(lái)模擬的localStudent對(duì)象們

localStudent1類:

public class LocalStudent1 implements Observer {

    private Subject onlineTeacher;

    //構(gòu)造器需要OnlineTeacher對(duì)象(也就是subject),用來(lái)注冊(cè)自己
    public LocalStudent1(Subject onlineTeacher) {
        this.onlineTeacher = onlineTeacher;
        onlineTeacher.registerObserver(this);

    }


    @Override
    public void updates(String message) {
        System.out.println("localStudent1從onlineTeacher那兒得到的message是:" +
                message +","+
                "我領(lǐng)悟到的是:女子和小人一樣");
    }
}

localStudent2類:

public class LocalStudent2 implements Observer {
    private Subject onlineTeacher;

    public LocalStudent2(Subject onlineTeacher) {
        this.onlineTeacher = onlineTeacher;
        onlineTeacher.registerObserver(this);
    }

    @Override
    public void updates(String message) {
        System.out.println("localStudent2從onlineTeacher那兒得到的message是:" +
                message +","+
                "我領(lǐng)悟到的是:這話還有后半句——近之則不遜,遠(yuǎn)之則怨");
    }
}

localStudent3類:

public class LocalStudent3 implements Observer{

    private Subject onlineTeacher;

    public LocalStudent3(Subject onlineTeacher) {
        this.onlineTeacher = onlineTeacher;
        onlineTeacher.registerObserver(this);
    }

    @Override
    public void updates(String message) {
        System.out.println("localStudent3從onlineTeacher那兒得到的message是:" +
                message +","+
                "我領(lǐng)悟到的是:一個(gè)人對(duì)他親近了,他對(duì)你不尊重,疏遠(yuǎn)了卻又有怨言!");

    }
}
運(yùn)行ObserverPatternRunDemo.java
public class ObserverPatternRunDemo {

    public static void main (String [] args){
        OnlineTeacher onlineTeacher = new OnlineTeacher();

        LocalStudent1 localStudent1 = new LocalStudent1(onlineTeacher);
        LocalStudent2 localStudent2 = new LocalStudent2(onlineTeacher);
        LocalStudent3 localStudent3 = new LocalStudent3(onlineTeacher);

        onlineTeacher.setMessage("子曰:唯女子與小人難養(yǎng)也");
    }


}

運(yùn)行時(shí),以localStudent1對(duì)象為例。生成該對(duì)象時(shí),會(huì)調(diào)用onlineTeacher對(duì)象的registerObserver()方法,將其自身加入到onlineTeacher對(duì)象的observerArrayList當(dāng)中。
當(dāng)onlineTeacher對(duì)象調(diào)用setMessage("子曰:唯女子與小人難養(yǎng)也");時(shí),相當(dāng)于message的值為子曰:唯女子與小人難養(yǎng)也。

//OnlineTeacher.java中定義的setMessage()和messageChanged()方法
...
  //OnlineTeacher有一個(gè)方法,setMessage()
    public void setMessage(String newMessage) {
        this.message = newMessage;
        messageChanged(); //message賦值之后,調(diào)用messageChanged()方法
    }

    //還有一個(gè)方法,messageChanged,在此方法中調(diào)用notifyObservers()
    public void messageChanged() {
        notifyObservers();
    }
}
...

根據(jù)onlineTeacher類中定義的方法,應(yīng)有:
先調(diào)用messageChanged()方法,然后會(huì)調(diào)用notifyObservers()方法,而notifyObservers()方法會(huì)遍歷所有的Observer對(duì)象,并調(diào)用他們的update()方法:

  //實(shí)現(xiàn)notifyObservers(),實(shí)質(zhì)上就是遍歷observerArrayList,讓其中的每一個(gè)observer對(duì)象調(diào)用他們的update()方法
    @Override
    public void notifyObservers() {
        for (int i = 0; i < observerArrayList.size(); i++) {
            observerArrayList.get(i).updates(message);
        }
    }

3個(gè)localStudent對(duì)象的update()方法
localStudent1.update();

   @Override
    public void updates(String message) {
        System.out.println("localStudent1從onlineTeacher那兒得到的message是:" +
                message +","+
                "我領(lǐng)悟到的是:女子和小人一樣");
    }
}

localStudent2.update();

  @Override
    public void updates(String message) {
        System.out.println("localStudent2從onlineTeacher那兒得到的message是:" +
                message +","+
                "我領(lǐng)悟到的是:這話還有后半句——近之則不遜,遠(yuǎn)之則怨");
    }
**localStudent3.update();**
   @Override
    public void updates(String message) {
        System.out.println("localStudent3從onlineTeacher那兒得到的message是:" +
                message +","+
                "我領(lǐng)悟到的是:一個(gè)人對(duì)他親近了,他對(duì)你不尊重,疏遠(yuǎn)了卻又有怨言!");

    }
Demo運(yùn)行的結(jié)果
localStudent1從onlineTeacher那兒得到的message是:子曰:唯女子與小人難養(yǎng)也,我領(lǐng)悟到的是:女子和小人一樣
localStudent2從onlineTeacher那兒得到的message是:子曰:唯女子與小人難養(yǎng)也,我領(lǐng)悟到的是:這話還有后半句——近之則不遜,遠(yuǎn)之則怨
localStudent3從onlineTeacher那兒得到的message是:子曰:唯女子與小人難養(yǎng)也,我領(lǐng)悟到的是:一個(gè)人對(duì)他親近了,他對(duì)你不尊重,疏遠(yuǎn)了卻又有怨言!

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

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

相關(guān)文章

  • 設(shè)計(jì)模式察者設(shè)計(jì)模式

    摘要:關(guān)鍵概念理解觀察者設(shè)計(jì)模式中主要區(qū)分兩個(gè)概念觀察者指觀察者對(duì)象,也就是消息的訂閱者被觀察者指要觀察的目標(biāo)對(duì)象,也就是消息的發(fā)布者。 原文首發(fā)于微信公眾號(hào):jzman-blog,歡迎關(guān)注交流! 最近補(bǔ)一下設(shè)計(jì)模式相關(guān)的知識(shí),關(guān)于觀察者設(shè)計(jì)模式主要從以下幾個(gè)方面來(lái)學(xué)習(xí),具體如下: 什么是觀察者設(shè)計(jì)模式 關(guān)鍵概念理解 通知觀察者的方式 觀察者模式的實(shí)現(xiàn) 觀察者模式的優(yōu)缺點(diǎn) 使用場(chǎng)景 下面...

    NotFound 評(píng)論0 收藏0
  • 設(shè)計(jì)模式察者模式與發(fā)布訂閱模式

    摘要:觀察者模式與發(fā)布訂閱的區(qū)別在模式中,知道,同時(shí)還保留了的記錄。發(fā)布者訂閱者在大多情況下是異步方式使用消息隊(duì)列。圖片源于網(wǎng)絡(luò)侵權(quán)必刪如果以結(jié)構(gòu)來(lái)分辨模式,發(fā)布訂閱模式相比觀察者模式多了一個(gè)中間件訂閱器,所以發(fā)布訂閱模式是不同于觀察者模式的。 學(xué)習(xí)了一段時(shí)間設(shè)計(jì)模式,當(dāng)學(xué)到觀察者模式和發(fā)布訂閱模式的時(shí)候遇到了很大的問(wèn)題,這兩個(gè)模式有點(diǎn)類似,有點(diǎn)傻傻分不清楚,博客起因如此,開(kāi)始對(duì)觀察者和發(fā)布...

    BaronZhang 評(píng)論0 收藏0
  • 設(shè)計(jì)模式 -- 察者模式

    摘要:總結(jié)一下從表面上看觀察者模式里,只有兩個(gè)角色觀察者被觀察者而發(fā)布訂閱模式,卻不僅僅只有發(fā)布者和訂閱者兩個(gè)角色,還有第三個(gè)角色經(jīng)紀(jì)人存在。參考鏈接觀察者模式發(fā)布訂閱模式 做了這么長(zhǎng)時(shí)間的 菜鳥(niǎo)程序員 ,我好像還沒(méi)有寫(xiě)過(guò)一篇關(guān)于設(shè)計(jì)模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設(shè)計(jì)模式在從頭學(xué)習(xí)一遍,不然都對(duì)不起我這 菜鳥(niǎo) 的身份。那這次,就從觀察者模式開(kāi)始好啦...

    chengtao1633 評(píng)論0 收藏0
  • 設(shè)計(jì)模式 -- 察者模式

    摘要:總結(jié)一下從表面上看觀察者模式里,只有兩個(gè)角色觀察者被觀察者而發(fā)布訂閱模式,卻不僅僅只有發(fā)布者和訂閱者兩個(gè)角色,還有第三個(gè)角色經(jīng)紀(jì)人存在。參考鏈接觀察者模式發(fā)布訂閱模式 做了這么長(zhǎng)時(shí)間的 菜鳥(niǎo)程序員 ,我好像還沒(méi)有寫(xiě)過(guò)一篇關(guān)于設(shè)計(jì)模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設(shè)計(jì)模式在從頭學(xué)習(xí)一遍,不然都對(duì)不起我這 菜鳥(niǎo) 的身份。那這次,就從觀察者模式開(kāi)始好啦...

    makeFoxPlay 評(píng)論0 收藏0
  • 訂閱發(fā)布模式察者模式的區(qū)別

    摘要:或許以前認(rèn)為訂閱發(fā)布模式是觀察者模式的一種別稱,但是發(fā)展至今,概念已經(jīng)有了不少區(qū)別。參考文章訂閱發(fā)布模式和觀察者模式真的不一樣 首選我們需要先了解兩者的定義和實(shí)現(xiàn)的方式,才能更好的區(qū)分兩者的不同點(diǎn)。 或許以前認(rèn)為訂閱發(fā)布模式是觀察者模式的一種別稱,但是發(fā)展至今,概念已經(jīng)有了不少區(qū)別。 訂閱發(fā)布模式 在軟件架構(gòu)中,發(fā)布-訂閱是一種消息范式,消息的發(fā)送者(稱為發(fā)布者)不會(huì)將消息直接發(fā)送給特...

    ysl_unh 評(píng)論0 收藏0
  • 我的Java設(shè)計(jì)模式-察者模式

    摘要:為了幫助灰太狼擺脫被老婆平底鍋抽的悲劇,發(fā)起了解救灰太狼的行動(dòng),必須要知道觀察者模式。持有觀察者對(duì)象的集合。設(shè)計(jì)模式源碼下載 相信大家都有看過(guò)《喜洋洋與灰太狼》,說(shuō)的是灰太狼和羊族的斗爭(zhēng),而每次的結(jié)果都是灰太狼一飛沖天,伴隨著一句我還會(huì)回來(lái)的......。為灰太狼感到悲哀,抓不到羊,在家也被老婆平底鍋虐待。灰太狼為什么會(huì)這么背? 很簡(jiǎn)單,灰太狼本身就有暴露行蹤的屬性,羊咩咩就能知曉灰太...

    smartlion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<