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

行為型設計模式之觀察者模式【設計模式系列】

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

系列文章目錄

C++技能系列
Linux通信架構系列
C++高性能優(yōu)化編程系列
深入理解軟件架構設計系列
高級C++并發(fā)線程編程
設計模式系列

期待你的關注哦?。?!
行為型設計模式之觀察者模式【設計模式系列】,設計模式系列,設計模式,觀察者模式,java,C++,架構

現在的一切都是為將來的夢想編織翅膀,讓夢想在現實中展翅高飛。
Now everything is for the future of dream weaving wings, let the dream fly in reality.

一、觀察者模式介紹

?? 意圖:
定義對象間的一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。

?? 主要解決:
一個對象狀態(tài)改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。

?? 何時使用:
一個對象(目標對象)的狀態(tài)發(fā)生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。

?? 如何解決:
使用面向對象技術,可以將這種依賴關系弱化。

觀察者模式(Observer),又叫發(fā)布-訂閱模式(Publish/Subscribe):定義對象間的一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都要得到通知并自動更新。

觀察者模式從根本上講必須包含兩個角色:觀察者和被觀察對象。

被觀察對象自身應該包含一個容器來存放觀察者對象,當被觀察者自身發(fā)生改變時通知容器內所有的觀察者對象自動更新。

觀察者對象可以注冊到被觀察者的中,完成注冊后可以檢測被觀察者的變化,接收被觀察者的通知。當然觀察者也可以被注銷掉,停止對被觀察者的監(jiān)控。

行為型設計模式之觀察者模式【設計模式系列】,設計模式系列,設計模式,觀察者模式,java,C++,架構

圖1_1 觀察者模式類圖

二、觀察者模式優(yōu)缺點

2.1 優(yōu)點

  • 觀察者和被觀察者是抽象耦合的。

  • 建立一套觸發(fā)機制。

2.2 缺點

  • 如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。

  • 如果在觀察者和觀察目標之間有循環(huán)依賴的話,觀察目標會觸發(fā)它們之間進行循環(huán)調用,可能導致系統崩潰。

  • 觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。

三、觀察者模式使用場景

  • 當一個抽象模型有兩個方面,其中一個方面依賴于另一方面。將這二者封裝在獨立的對象中以使它們可以各自獨立的改變和復用;

  • 當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變;

  • 當一個對象必須通知其它對象,而它又不能假定其它對象是誰;也就是說,你不希望這些對象是緊密耦合的。

四、觀察者模式實現

4.1 示例1 - 代碼實現

這里的目標 Subject 提供依賴于它的觀察者 Observer 的注冊( Attach) 和注銷( Detach)操作,并且提供了使得依賴于它的所有觀察者同步的操作( Notify)。 觀察者 Observer 則提供一個 Update 操作, 注意這里的 Observer 的 Update 操作并不在 Observer 改變了 Subject 目標狀態(tài)的時候就對自己進行更新, 這個更新操作要延遲到 Subject 對象發(fā)出 Notify 通知所有Observer 進行修改(調用 Update)。文章來源地址http://www.zghlxwxcb.cn/news/detail-610551.html

#include <iostream>
#include <string>
#include <list>
using namespace std;
 
class Subject;
//抽象觀察者
class Observer
{
protected:
    string name;
    Subject *sub;
public:
    Observer(string name, Subject *sub)
    {
        this->name = name;
        this->sub = sub;
    }
    virtual void update() = 0;
};
//具體的觀察者,看股票的
class StockObserver :public Observer
{
public:
    StockObserver(string name, Subject *sub) :Observer(name, sub)
    {
    }
    void update();
};
//具體的觀察者,看NBA的
class NBAObserver :public Observer
{
public:
    NBAObserver(string name, Subject *sub) :Observer(name, sub)
    {
    }
    void update();
};
//抽象通知者
class Subject
{
protected:
    list<Observer*> observers;
public:
    string action;
    virtual void attach(Observer*) = 0;
    virtual void detach(Observer*) = 0;
    virtual void notify() = 0;
};
//具體通知者,秘書
class Secretary :public Subject
{
    void attach(Observer *observer)
    {
        observers.push_back(observer);
    }
    void detach(Observer *observer)
    {
        list<Observer *>::iterator iter = observers.begin();
        while (iter != observers.end())
        {
            if ((*iter) == observer)
            {
                observers.erase(iter);
            }
            ++iter;
        }
    }
    void notify()
    {
        list<Observer *>::iterator iter = observers.begin();
        while (iter != observers.end())
        {
            (*iter)->update();
            ++iter;
        }
    }
};
 
void StockObserver::update()
{
    cout << name << " 收到消息:" << sub->action << endl;
    if (sub->action == "梁所長來了!")
    {
        cout << "我馬上關閉股票,裝做很認真工作的樣子!" << endl;
    }
}
 
void NBAObserver::update()
{
    cout << name << " 收到消息:" << sub->action << endl;
    if (sub->action == "梁所長來了!")
    {
        cout << "我馬上關閉NBA,裝做很認真工作的樣子!" << endl;
    }
}
 
int main()
{
    Subject *dwq = new Secretary(); //創(chuàng)建觀察者<br>    //被觀察的對象
    Observer *xs = new NBAObserver("xiaoshuai", dwq);
    Observer *zy = new NBAObserver("zouyue", dwq);
    Observer *lm = new StockObserver("limin", dwq);
    //加入觀察隊列
    dwq->attach(xs);
    dwq->attach(zy);
    dwq->attach(lm);
    //事件
    dwq->action = "去吃飯了!";<br>    //通知
    dwq->notify();
    cout << endl;
    dwq->action = "梁所長來了!";
    dwq->notify();
    return 0;
}

4.1 示例2 - 代碼實現

#include <iostream>
#include <list>
using namespace std;
 
class Observer
{
public:
    virtual void Update(int) = 0;
};
 
class Subject
{
public:
    virtual void Attach(Observer *) = 0;
    virtual void Detach(Observer *) = 0;
    virtual void Notify() = 0;
};
 
class ConcreteObserver : public Observer
{
public:
    ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}
 
    void Update(int value)
    {
        cout << "ConcreteObserver get the update. New State:" << value << endl;
    }
 
private:
    Subject *m_pSubject;
};
 
class ConcreteObserver2 : public Observer
{
public:
    ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}
 
    void Update(int value)
    {
        cout << "ConcreteObserver2 get the update. New State:" << value << endl;
    }
 
private:
    Subject *m_pSubject;
};
 
class ConcreteSubject : public Subject
{
public:
    void Attach(Observer *pObserver);
    void Detach(Observer *pObserver);
    void Notify();
 
    void SetState(int state)
    {
        m_iState = state;
    }
 
private:
    std::list<Observer *> m_ObserverList;
    int m_iState;
};
 
void ConcreteSubject::Attach(Observer *pObserver)
{
    m_ObserverList.push_back(pObserver);
}
 
void ConcreteSubject::Detach(Observer *pObserver)
{
    m_ObserverList.remove(pObserver);
}
 
void ConcreteSubject::Notify()
{
    std::list<Observer *>::iterator it = m_ObserverList.begin();
    while (it != m_ObserverList.end())
    {
        (*it)->Update(m_iState);
        ++it;
    }
}
 
int main()
{
    // Create Subject
    ConcreteSubject *pSubject = new ConcreteSubject();
 
    // Create Observer
    Observer *pObserver = new ConcreteObserver(pSubject);
    Observer *pObserver2 = new ConcreteObserver2(pSubject);
 
    // Change the state
    pSubject->SetState(2);
 
    // Register the observer
    pSubject->Attach(pObserver);
    pSubject->Attach(pObserver2);
 
    pSubject->Notify();
 
    // Unregister the observer
    pSubject->Detach(pObserver);
 
    pSubject->SetState(3);
    pSubject->Notify();
 
    delete pObserver;
    delete pObserver2;
    delete pSubject;
}

到了這里,關于行為型設計模式之觀察者模式【設計模式系列】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

  • 設計模式—行為型模式之觀察者模式

    設計模式—行為型模式之觀察者模式

    觀察者模式(Observer Pattern):定義對象間的一種一對多依賴關系,使得每當一個對象狀態(tài)發(fā)生改變時,其相關依賴對象皆得到通知并被自動更新。觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependent

    2024年01月22日
    瀏覽(26)
  • 笨蛋學設計模式行為型模式-觀察者模式【14】

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

    2024年01月24日
    瀏覽(27)
  • c#設計模式-行為型模式 之 觀察者模式

    c#設計模式-行為型模式 之 觀察者模式

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

    2024年02月14日
    瀏覽(22)
  • 【行為型設計模式】C#設計模式之觀察者模式

    參考代碼:

    2024年02月13日
    瀏覽(24)
  • C++設計模式行為型之觀察者模式

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

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

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

    2024年02月12日
    瀏覽(25)
  • 軟件設計模式系列之二十一——觀察者模式

    軟件設計模式系列之二十一——觀察者模式

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

    2024年02月08日
    瀏覽(26)
  • Java設計模式系列--觀察者模式寫法2:JDK

    Java設計模式系列--觀察者模式寫法2:JDK

    原文網址:Java設計模式系列--觀察者模式寫法2:JDK_IT利刃出鞘的博客-CSDN博客 說明 本文用示例介紹觀察者模式的一種寫法:JDK。 JDK的觀察者模式簡介 在 Java 中,java.util.Observable 類和 java.util.Observer 接口定義了觀察者模式,只要實現這兩個接口就可以編寫觀察者模式。 1. Ob

    2024年02月13日
    瀏覽(23)
  • 設計模式——觀察者模式

    設計模式——觀察者模式

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

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

    【設計模式】觀察者模式

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

    2024年02月13日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包