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

設(shè)計模式之觀察者(發(fā)布訂閱)模式

這篇具有很好參考價值的文章主要介紹了設(shè)計模式之觀察者(發(fā)布訂閱)模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

  class Program
    {
        static void Main(string[] args)
        {
            ConcreteSubject concreteSubject = new ConcreteSubject();

            concreteSubject.Attach(new ConcreteObserver(concreteSubject, "奶茶店"));
            concreteSubject.Attach(new ConcreteObserver(concreteSubject, "快餐店"));
            concreteSubject.Attach(new ConcreteObserver(concreteSubject, "花店"));

            concreteSubject.SubjectState = "顧客來了";
            concreteSubject.Notify();//消息通知
            Console.ReadLine();
        }
    }

    //抽象消息通知者,一般用一一個抽象類或者一個接口實現(xiàn)。它把所有對觀察者對象的引用保存在一個容器里,每個消息通知者都可以聯(lián)系任何數(shù)量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象
    abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();//觀察者列表

        //增加觀察者
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        //移除觀察者
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }

        //將消息通知給所觀察者
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }


    }

    //抽象觀察者,是所有觀察者的基類,在得到消息發(fā)布者的消息后,使用更新方法更新自己的狀態(tài)
    abstract class Observer
    {
        public abstract void Update();
    }


    //具體消息通知者,繼承自Subject的具體類,將有關(guān)狀態(tài)存入具體觀察者對象;在具體消息通知者內(nèi)部狀態(tài)改變的時候,給所有在容器中的觀察者發(fā)布消息。
    class ConcreteSubject : Subject
    {
        private string subjectState;//消息通知者的具體消息

        //具體被觀察者狀態(tài)
        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }


    //具體觀察者,實現(xiàn)抽象觀察者的接口,以便本身的狀態(tài)與消息通知者的狀態(tài)相協(xié)調(diào)
    class ConcreteObserver : Observer
    {
        private string name;
        private string observerState;
        private ConcreteSubject subject;

        public ConcreteObserver(ConcreteSubject subject, string name)
        {
            this.subject = subject;
            this.name = name;
        }

        public override void Update()
        {
            observerState = subject.SubjectState;
            Console.WriteLine("{0}的新狀態(tài)是{1}",name,observerState);
        }

        public ConcreteSubject Subject
        {
            get { return subject; }
            set { subject = value; }
        }


    }

觀察者模式主要解決的問題:當(dāng)一個對象狀態(tài)發(fā)生改變后給其他的對象通知

觀察者的優(yōu)點:
觀察者和被觀察者是抽象耦合的,讓耦合的雙方都依賴于抽象,而不是依賴于具體,從而使得各自的變化都不會影響另一邊的變化。

觀察者的缺點:
1、如果一個被觀察者對象有很多的直接或間接的觀察者的話,消耗的時間會增加很多。

2、觀察者模式?jīng)]有相應(yīng)的機制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的,而僅僅是知道被觀察者發(fā)生變化,會有很一些不需要改變狀態(tài)的觀察者被迫發(fā)生狀態(tài)改變。

3、如果觀察者與被觀察者之間有循環(huán)依賴,會造成陷入死循環(huán)中,導(dǎo)致系統(tǒng)崩潰。


觀察者模式的變體—— 發(fā)布訂閱模式

發(fā)布訂閱模式需要引用到了事件與委托這個兩種類型

委托
事件

訂閱發(fā)布模式,發(fā)布者的消息發(fā)送者不會講消息直接發(fā)送給訂閱者,這意味著發(fā)布者和訂閱者不知道彼此的存在。在發(fā)布者和訂閱者之間存在第三個組件,稱為消息代理或調(diào)度中心和中間件,它維持著發(fā)布者和訂閱者之間的聯(lián)系,過濾所有發(fā)布者傳入的消息并相應(yīng)地發(fā)布它們給訂閱者。

優(yōu)點
1、支持簡單的廣播通信,當(dāng)對象狀態(tài)發(fā)生改變時,會自動通知已經(jīng)訂閱過的對象
2、發(fā)布者與訂閱者耦合性降低,發(fā)布者只管發(fā)布一條消息后,訂閱者只監(jiān)聽發(fā)布者的事件名,只要發(fā)布者的事件名不變,它不管發(fā)布者如何改變

缺點
1、創(chuàng)建訂閱者需要消耗一定時間的內(nèi)存
2、增加維護的難度

區(qū)別與聯(lián)系
聯(lián)系:
訂閱發(fā)布是觀察者模式的一種變種。
區(qū)別:
1、觀察模式中觀察者和被觀察者是松耦合的關(guān)系、發(fā)布-訂閱模式中完全不存在耦合。
2、觀察模式中觀察者與被觀察者相互感知,發(fā)布-訂閱模式中存在中間調(diào)度工廠。文章來源地址http://www.zghlxwxcb.cn/news/detail-731204.html

class Program
    {
        static void Main(string[] args)
        {
            Client c1 = new Client();

            ObserverA a = new ObserverA("路北", c1);
            ObserverB b = new ObserverB("路南", c1);

            c1.Update += new Handler(a.Work);
            c1.Update += new Handler(b.Work);

            c1.SubjectState = "顧客";
            c1.Notify();
        }
    }


    interface Subject
    {
       public void  Notify();
        string SubjectState
        {
            get;
            set;
        }
    }



    delegate void Handler();//聲明委托
    class Client : Subject
    {
        public event Handler Update;//聲明Handler(事件處理程序)的委托事件Update方法

        private string action;

        public void Notify()//引發(fā)Update方法
        {
            Update();
        }

        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }

 
    }
    class ObserverA
    {
        private string name;
        private Subject subject;
        public ObserverA(string name, Subject subject)
        {
            this.name = name;
            this.subject = subject;
            
        }

        public void Work()
        {
            Console.WriteLine("{0}來了,{1}開始工作",subject.SubjectState,name);
        }
    }

    class ObserverB
    {
        private string name;
        private Subject subject;
        public ObserverB(string name, Subject subject)
        {
            this.name = name;
            this.subject = subject;

        }

        public void Work()
        {
            Console.WriteLine("{0}來了,{1}開始工作", subject.SubjectState, name);
        }
    }

到了這里,關(guān)于設(shè)計模式之觀察者(發(fā)布訂閱)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • C++之觀察者模式(發(fā)布-訂閱)

    C++之觀察者模式(發(fā)布-訂閱)

    目錄 模式簡介 介紹 優(yōu)點 缺點 代碼實現(xiàn) 場景說明 實現(xiàn)代碼 運行結(jié)果 觀察者模式( Observer Pattern ) ,也叫我們熟知的 發(fā)布-訂閱模式。 它是一種 行為型模式。 介紹 觀察者模式主要關(guān)注的是對象的一對多的關(guān)系, 也就是多個對象依賴于一個對象,當(dāng)該對象的 狀態(tài)發(fā)生改變

    2024年02月15日
    瀏覽(93)
  • 觀察者模式、中介者模式和發(fā)布訂閱模式

    觀察者模式、中介者模式和發(fā)布訂閱模式

    觀察者模式定義了對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都將得到通知,并自動更新 觀察者模式屬于行為型模式,行為型模式關(guān)注的是對象之間的通訊,觀察者模式就是觀察者和被觀察者之間的通訊 例如生活中,我們可以用報

    2024年02月15日
    瀏覽(88)
  • JavaScript 簡單實現(xiàn)觀察者模式和發(fā)布-訂閱模式

    JavaScript 簡單實現(xiàn)觀察者模式和發(fā)布-訂閱模式

    大家好,我是南木元元,熱衷分享有趣實用的文章。今天來聊聊設(shè)計模式中常用的觀察者模式和發(fā)布-訂閱模式。 觀察者模式定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都將得到通知。 如何理解這句話呢?來舉個生活中的例子

    2024年02月12日
    瀏覽(638)
  • 從Vue層面 - 解析發(fā)布訂閱模式和觀察者模式區(qū)別

    從Vue層面 - 解析發(fā)布訂閱模式和觀察者模式區(qū)別

    觀察者模式和發(fā)布訂閱模式作為日常開發(fā)中經(jīng)常使用到的模式,我一直不能做到很好的區(qū)分。最近在看Vue的源碼,里面設(shè)計到了觀察者模式,比較感興趣,就去學(xué)習(xí)了下,這里做個總結(jié)吧。 基于一個 事件中心 ,接收通知的對象是訂閱者,需要先訂閱某個事件,觸發(fā)事件的對

    2024年02月15日
    瀏覽(89)
  • 【JavaScript】手撕前端面試題:寄生組合式繼承 | 發(fā)布訂閱模式 | 觀察者模式

    ?????個人簡介:大三學(xué)生,一個不甘平庸的平凡人?? ??? NodeJS專欄:Node.js從入門到精通 ??? 博主的前端之路(源創(chuàng)征文一等獎作品):前端之行,任重道遠(yuǎn)(來自大三學(xué)長的萬字自述) ??? TypeScript知識總結(jié):TypeScript從入門到精通(十萬字超詳細(xì)知識點總結(jié)) ??

    2023年04月08日
    瀏覽(96)
  • 設(shè)計模式——觀察者模式

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

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

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

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

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

    2024年02月13日
    瀏覽(20)
  • 設(shè)計模式---觀察者模式

    1,概念 ????????屬于行為模式的一種,定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一對象主題對象,這個主題對象在狀態(tài)變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。 在觀察者模式中有如下角色: Subject:抽象主題(抽象被觀察者),

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

    觀察者模式是一種行為型設(shè)計模式,它定義了一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,其所有依賴者都會收到通知并自動更新。當(dāng)對象間存在一對多關(guān)系時,則使用觀察者模式(Observer Pattern)。比如,當(dāng)一個對象被修改時,則會自動通知依賴它的對象。觀察者

    2024年02月15日
    瀏覽(22)
  • 設(shè)計模式:觀察者模式

    定義 觀察者模式(Observer Pattern)是一種行為設(shè)計模式,允許一個對象(稱為“主題”或“可觀察對象”)維護一組依賴于它的對象(稱為“觀察者”),當(dāng)主題的狀態(tài)發(fā)生變化時,會自動通知所有觀察者對象。 應(yīng)用場景 觀察者模式適用于以下場景: 聯(lián)動反應(yīng) :當(dāng)一個對象

    2024年04月08日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包