国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計(jì)模式之觀察者模式【行為型模式】

這篇具有很好參考價(jià)值的文章主要介紹了設(shè)計(jì)模式之觀察者模式【行為型模式】。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔> 學(xué)習(xí)的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。各位小伙伴,如果您:
想系統(tǒng)/深入學(xué)習(xí)某技術(shù)知識點(diǎn)…
一個(gè)人摸索學(xué)習(xí)很難堅(jiān)持,想組團(tuán)高效學(xué)習(xí)…
想寫博客但無從下手,急需寫作干貨注入能量…
熱愛寫作,愿意讓自己成為更好的人…


前言

一、概述
二、結(jié)構(gòu)
三、案例實(shí)現(xiàn)
四、優(yōu)缺點(diǎn)
五、使用場景
六、JDK中提供的實(shí)現(xiàn)


一、概述

定義:

又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,它定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象。這個(gè)主題對象在狀態(tài)變化時(shí),會通知所有的觀察者對象,使他們能夠自動更新自己。

二、結(jié)構(gòu)

在觀察者模式中有如下角色:

  • Subject:抽象主題(抽象被觀察者),抽象主題角色把所有觀察者對象保存在一個(gè)集合里,每個(gè)主題都可以有任意數(shù)量的觀察者,抽象主題提供一個(gè)接口,可以增加和刪除觀察者對象。
  • ConcreteSubject:具體主題(具體被觀察者),該角色將有關(guān)狀態(tài)存入具體觀察者對象,在具體主題的內(nèi)部狀態(tài)發(fā)生改變時(shí),給所有注冊過的觀察者發(fā)送通知。
  • Observer:抽象觀察者,是觀察者的抽象類,它定義了一個(gè)更新接口,使得在得到主題更改通知時(shí)更新自己。
  • ConcrereObserver:具體觀察者,實(shí)現(xiàn)抽象觀察者定義的更新接口,以便在得到主題更改通知時(shí)更新自身的狀態(tài)。

三、案例實(shí)現(xiàn)

【例】微信公眾號

在使用微信公眾號時(shí),大家都會有這樣的體驗(yàn),當(dāng)你關(guān)注的公眾號中有新內(nèi)容更新的話,它就會推送給關(guān)注公眾號的微信用戶端。我們使用觀察者模式來模擬這樣的場景,微信用戶就是觀察者,微信公眾號是被觀察者,有多個(gè)的微信用戶關(guān)注了程序猿這個(gè)公眾號。

類圖如下:
設(shè)計(jì)模式之觀察者模式【行為型模式】,軟件設(shè)計(jì)模式,設(shè)計(jì)模式,觀察者模式,java,軟件工程
代碼如下:

定義抽象觀察者類,里面定義一個(gè)更新的方法

public interface Observer {
    void update(String message);
}

定義具體觀察者類,微信用戶是觀察者,里面實(shí)現(xiàn)了更新的方法

public class WeixinUser implements Observer {
    // 微信用戶名
    private String name;

    public WeixinUser(String name) {
        this.name = name;
    }
    @Override
    public void update(String message) {
        System.out.println(name + "-" + message);
    }
}

定義抽象主題類,提供了attach、detach、notify三個(gè)方法

//抽象主題角色類
public interface Subject {
    //增加訂閱者
    public void attach(Observer observer);

    //刪除訂閱者
    public void detach(Observer observer);
    
    //通知訂閱者更新消息
    public void notify(String message);
}

微信公眾號是具體主題(具體被觀察者),里面存儲了訂閱該公眾號的微信用戶,并實(shí)現(xiàn)了抽象主題中的方法

public class SubscriptionSubject implements Subject {
    //儲存訂閱公眾號的微信用戶
    private List<Observer> weixinUserlist = new ArrayList<Observer>();

    @Override
    public void attach(Observer observer) {
        weixinUserlist.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        weixinUserlist.remove(observer);
    }

    @Override
    public void notify(String message) {
        //遍歷集合
        for (Observer observer : weixinUserlist) {
            //調(diào)用觀察者對象中的update方法
            observer.update(message);
        }
    }
}

客戶端程序

public class Client {
    public static void main(String[] args) {
        //創(chuàng)建公眾號對象
        SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
        //創(chuàng)建微信用戶
        WeixinUser user1=new WeixinUser("孫悟空");
        WeixinUser user2=new WeixinUser("豬悟能");
        WeixinUser user3=new WeixinUser("沙悟凈");
        //訂閱公眾號
        mSubscriptionSubject.attach(user1);
        mSubscriptionSubject.attach(user2);
        mSubscriptionSubject.attach(user3);
        //公眾號更新發(fā)出消息給訂閱的微信用戶
        mSubscriptionSubject.notify("哥的時(shí)代的專欄更新了");
    }
}

設(shè)計(jì)模式之觀察者模式【行為型模式】,軟件設(shè)計(jì)模式,設(shè)計(jì)模式,觀察者模式,java,軟件工程

四、優(yōu)缺點(diǎn)

1,優(yōu)點(diǎn):

  • 降低了目標(biāo)與觀察者之間的耦合關(guān)系,兩者之間是抽象耦合關(guān)系。
  • 被觀察者發(fā)送通知,所有注冊的觀察者都會收到信息【可以實(shí)現(xiàn)廣播機(jī)制】

2,缺點(diǎn):

  • 如果觀察者非常多的話,那么所有的觀察者收到被觀察者發(fā)送的通知會耗時(shí)
  • 如果被觀察者有循環(huán)依賴的話,那么被觀察者發(fā)送通知會使觀察者循環(huán)調(diào)用,會導(dǎo)致系統(tǒng)崩潰

五、使用場景

  • 對象間存在一對多關(guān)系,一個(gè)對象的狀態(tài)發(fā)生改變會影響其他對象。
  • 當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一方面時(shí)。

六、JDK中提供的實(shí)現(xiàn)

在 Java 中,通過 java.util.Observable 類和 java.util.Observer 接口定義了觀察者模式,只要實(shí)現(xiàn)它們的子類就可以編寫觀察者模式實(shí)例。

1,Observable類

Observable 類是抽象目標(biāo)類(被觀察者),它有一個(gè) Vector 集合成員變量,用于保存所有要通知的觀察者對象,下面來介紹它最重要的 3 個(gè)方法。

  • void addObserver(Observer o) 方法:用于將新的觀察者對象添加到集合中。

  • void notifyObservers(Object arg) 方法:調(diào)用集合中的所有觀察者對象的 update方法,通知它們數(shù)據(jù)發(fā)生改變。通常越晚加入集合的觀察者越先得到通知。

  • void setChange() 方法:用來設(shè)置一個(gè) boolean 類型的內(nèi)部標(biāo)志,注明目標(biāo)對象發(fā)生了變化。當(dāng)它為true時(shí),notifyObservers() 才會通知觀察者。

2,Observer 接口

Observer 接口是抽象觀察者,它監(jiān)視目標(biāo)對象的變化,當(dāng)目標(biāo)對象發(fā)生變化時(shí),觀察者得到通知,并調(diào)用 update 方法,進(jìn)行相應(yīng)的工作。

【例】警察抓小偷

警察抓小偷也可以使用觀察者模式來實(shí)現(xiàn),警察是觀察者,小偷是被觀察者。代碼如下:

小偷是一個(gè)被觀察者,所以需要繼承Observable類

public class Thief extends Observable {

    private String name;

    public Thief(String name) {
        this.name = name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void steal() {
        System.out.println("小偷:我偷東西了,有沒有人來抓我?。?!");
        super.setChanged(); //changed  = true
        super.notifyObservers();
    }
}

警察是一個(gè)觀察者,所以需要讓其實(shí)現(xiàn)Observer接口

public class Policemen implements Observer {

    private String name;

    public Policemen(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("警察:" + ((Thief) o).getName() + ",我已經(jīng)盯你很久了,你可以保持沉默,但你所說的將成為呈堂證供?。。?);
    }
}

客戶端代碼

public class Client {
    public static void main(String[] args) {
        //創(chuàng)建小偷對象
        Thief t = new Thief("隔壁老王");
        //創(chuàng)建警察對象
        Policemen p = new Policemen("小李");
        //讓警察盯著小偷
        t.addObserver(p);
        //小偷偷東西
        t.steal();
    }
}

總結(jié)

以上就是設(shè)計(jì)模式之觀察者模式【行為型模式】的相關(guān)知識點(diǎn),希望對你有所幫助。
積跬步以至千里,積怠惰以至深淵。時(shí)代在這跟著你一起努力哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-780562.html

到了這里,關(guān)于設(shè)計(jì)模式之觀察者模式【行為型模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 行為型設(shè)計(jì)模式之觀察者模式【設(shè)計(jì)模式系列】

    行為型設(shè)計(jì)模式之觀察者模式【設(shè)計(jì)模式系列】

    C++技能系列 Linux通信架構(gòu)系列 C++高性能優(yōu)化編程系列 深入理解軟件架構(gòu)設(shè)計(jì)系列 高級C++并發(fā)線程編程 設(shè)計(jì)模式系列 期待你的關(guān)注哦?。?! 現(xiàn)在的一切都是為將來的夢想編織翅膀,讓夢想在現(xiàn)實(shí)中展翅高飛。 Now everything is for the future of dream weaving wings, let the dream fly in reali

    2024年02月15日
    瀏覽(19)
  • c#設(shè)計(jì)模式-行為型模式 之 觀察者模式

    c#設(shè)計(jì)模式-行為型模式 之 觀察者模式

    又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,它定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者 對象同時(shí)監(jiān)聽某一個(gè)主題對象。這個(gè)主題對象在狀態(tài)變化時(shí),會通知所有的觀察者對象,使他們能夠自 動更新自己。 在觀察者模式中有如下角色: Subject:抽象主題(抽象被觀察者)

    2024年02月14日
    瀏覽(22)
  • 笨蛋學(xué)設(shè)計(jì)模式行為型模式-觀察者模式【14】

    8.1.1概念 ? 觀察者模式定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象,當(dāng)主題對象狀態(tài)發(fā)生變化時(shí),會通知所有依賴它的觀察者對象,使它們都能夠得到通知并且被自動更新 8.1.2場景 ? 在我們生活中,用戶可以在音樂播放平臺關(guān)注多個(gè)歌手,而

    2024年01月24日
    瀏覽(29)
  • C++設(shè)計(jì)模式行為型之觀察者模式

    一、 概述 ????????觀察者模式定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對象都得到通知并被自動更新。 二、 示例代碼 #include list class Subject; class Observer { public: ?? ?virtual ~Observer(); ?? ?virtual void Update(Subject* theChangedSubject) =

    2024年02月14日
    瀏覽(27)
  • 深入理解設(shè)計(jì)模式-行為型之觀察者

    觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種 一對多的依賴關(guān)系 ,讓 多個(gè)觀察者對象 同時(shí)監(jiān)聽一個(gè) 主題對象 ,當(dāng) 主題對象 發(fā)生 變化 時(shí),所有依賴于它的 觀察者 對象都會得到 通知并更新。 在觀察者模式中,有兩個(gè)主要角色: Subject(主題):維護(hù)

    2024年02月12日
    瀏覽(25)
  • 軟件設(shè)計(jì)模式(四):觀察者、組合、享元模式

    軟件設(shè)計(jì)模式(四):觀察者、組合、享元模式

    在這篇文章中,荔枝將會梳理軟件設(shè)計(jì)模式中有關(guān)觀察者模式、組合模式和享元模式的內(nèi)容。其中組合模式和享元模式比較簡單,重點(diǎn)需要理解觀察者模式的機(jī)制以及為什么該模式實(shí)現(xiàn)了對象之間的松耦合。希望荔枝的梳理能對需要的小伙伴有幫助~~~ 前言 一、觀察者模式O

    2024年02月09日
    瀏覽(18)
  • 軟件設(shè)計(jì)模式系列之二十一——觀察者模式

    軟件設(shè)計(jì)模式系列之二十一——觀察者模式

    觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它允許對象之間建立一對多的依賴關(guān)系,當(dāng)一個(gè)對象的狀態(tài)發(fā)生變化時(shí),所有依賴于它的對象都會得到通知并自動更新。這個(gè)模式也被稱為發(fā)布-訂閱模式,因?yàn)樗M了一個(gè)主題(發(fā)布者)與多個(gè)觀察者(訂閱者)之間的

    2024年02月08日
    瀏覽(26)
  • 設(shè)計(jì)模式——觀察者模式

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

    觀察者模式可以分為觀察者和被觀察者,觀察者通過注冊到一個(gè)被觀察者中,也可視為訂閱,當(dāng)被觀察者的數(shù)據(jù)發(fā)生改變時(shí),會通知到觀察者,觀察者可以據(jù)此做出反應(yīng)。 可以類比訂閱報(bào)紙,報(bào)社就是被觀察者,訂閱者就是觀察者,訂閱者通過訂閱報(bào)紙與報(bào)社建立聯(lián)系,而報(bào)

    2024年02月15日
    瀏覽(18)
  • 【設(shè)計(jì)模式】觀察者模式

    【設(shè)計(jì)模式】觀察者模式

    觀察者模式(又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關(guān)系,讓多個(gè)觀察者對象同時(shí)監(jiān)聽某一個(gè)主題對象。這個(gè)主題對象在狀態(tài)變化時(shí),會通知所有的觀察者對象,使他們能夠自動更新自己。 Subject:抽象主題(被觀察者

    2024年02月13日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包