當前位置:首頁 » 股市行情 » 觀察者模式股票價格變動
擴展閱讀
怎樣知道主力在買股票 2025-06-25 22:07:14
點擊毀滅 2025-06-25 22:00:43
退市的股票買不著 2025-06-25 22:00:38

觀察者模式股票價格變動

發布時間: 2021-06-24 10:45:22

❶ 誰給我解釋下啥叫做觀察者模式

官方的定義:

The Observer Pattern defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically. (觀察者模式定義了對象間的一種一對多依賴關系,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並被自動更新)

❷ 觀察者模式和發布/訂閱模式的區別

觀察者(Observer)模式又名發布-訂閱(Publish/Subscribe)模式。GOF給觀察者模式如下定義:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。

在這里先講一下面向對象設計的一個重要原則——單一職責原則。因此系統的每個對象應該將重點放在問題域中的離散抽象上。因此理想的情況下,一個對象只做一件事情。這樣在開發中也就帶來了諸多的好處:提供了重用性和維護性,也是進行重構的良好的基礎。

因此幾乎所有的設計模式都是基於這個基本的設計原則來的。觀察者模式的起源我覺得應該是在GUI和業務數據的處理上,因為現在絕大多數講解觀察者模式的例子都是這一題材。但是觀察者模式的應用決不僅限於此一方面。

下面我們就來看看觀察者模式的組成部分。

1) 抽象目標角色(Subject):目標角色知道它的觀察者,可以有任意多個觀察者觀察同一個目標。並且提供注冊和刪除觀察者對象的介面。目標角色往往由抽象類或者介面來實現。

2) 抽象觀察者角色(Observer):為那些在目標發生改變時需要獲得通知的對象定義一個更新介面。抽象觀察者角色主要由抽象類或者介面來實現。

3) 具體目標角色(Concrete Subject):將有關狀態存入各個Concrete Observer對象。當它的狀態發生改變時, 向它的各個觀察者發出通知。

4) 具體觀察者角色(Concrete Observer):存儲有關狀態,這些狀態應與目標的狀態保持一致。實現Observer的更新介面以使自身狀態與目標的狀態保持一致。在本角色內也可以維護一個指向Concrete Subject對象的引用。

❸ 觀察者模式和中介者模式的區別

1.在Obsever模式中, 不存在封裝約束的單一對象。Observer 和 Subject 必須合作才能維持約束。
2.Communication(通訊)模式由觀察者和目標互聯的方式決定:單一目標通常有很多觀察者,有時一個目標的觀察者是另一個觀察者的目標。
3.Mediator 和 Observer 都能促進松耦合,然後Mediator 模式通過限制對象嚴格通過Mediator 進行通信來實現這個個目的。
4.Observer 模式創建觀察者對喜愛那個,觀察者對象向訂閱它們的對喜愛那個發布其感興趣的事件。

❹ 設計模式中的觀察者模式,如果觀察者的屬性發生變化,那麼該如何進行操作呢

observer 父類中增加一個屬性,在observer中賦值和判斷,這樣可能好點

❺ 觀察者模式是什麼

官方解釋:
觀察者模式(有時又被稱為發布-訂閱Subscribe>模式、模型-視圖View>模式、源-收聽者Listener>模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實作事件處理系統。
個人理解:
觀察者模式是一種思想,不需要人為的去關注觀察者和被觀察者之間是怎樣聯系的,實現了解耦,只需要對象去注冊被觀察者(Observerable)與觀察者(Observer),然後被觀察者去添加一個或者多個觀察者,當被觀察者發生變動就會立即通知所有的觀察者,下面讓我們來看看是怎樣實現這個功能的。
被觀察者首先通過addObserver(Observer o)來添加一個觀察者,底層代碼中會把這個對象o放進一個vector集合中,當然也可以添加多個觀察者,當觀察者發生變動的時候就會觸發
setChanged();
notifyObservers();
這兩個方法,然後底層代碼中就回去遍歷裝有觀察者的那個vector,然後
for (int i = arrLocal.length-1; i>=0; i--)
((Observer)arrLocal[i]).update(this, arg);
調用update方法通知每一個觀察者,這樣觀察者對象中就可以拿到被觀察者的相關對象和信息

❻ 什麼是觀察者模式`

觀察者(Observer)模式又名發布-訂閱(Publish/Subscribe)模式。GOF給觀察者模式如下定義:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。

在這里先講一下面向對象設計的一個重要原則——單一職責原則。因此系統的每個對象應該將重點放在問題域中的離散抽象上。因此理想的情況下,一個對象只做一件事情。這樣在開發中也就帶來了諸多的好處:提供了重用性和維護性,也是進行重構的良好的基礎。

因此幾乎所有的設計模式都是基於這個基本的設計原則來的。觀察者模式的起源我覺得應該是在GUI和業務數據的處理上,因為現在絕大多數講解觀察者模式的例子都是這一題材。但是觀察者模式的應用決不僅限於此一方面。

下面我們就來看看觀察者模式的組成部分。

1) 抽象目標角色(Subject):目標角色知道它的觀察者,可以有任意多個觀察者觀察同一個目標。並且提供注冊和刪除觀察者對象的介面。目標角色往往由抽象類或者介面來實現。

2) 抽象觀察者角色(Observer):為那些在目標發生改變時需要獲得通知的對象定義一個更新介面。抽象觀察者角色主要由抽象類或者介面來實現。

3) 具體目標角色(Concrete Subject):將有關狀態存入各個Concrete Observer對象。當它的狀態發生改變時, 向它的各個觀察者發出通知。

4) 具體觀察者角色(Concrete Observer):存儲有關狀態,這些狀態應與目標的狀態保持一致。實現Observer的更新介面以使自身狀態與目標的狀態保持一致。在本角色內也可以維護一個指向Concrete Subject對象的引用。

❼ 觀察者模式的例子

#include<iostream>#include<set>#include<string>usingnamespacestd;/////////////////////抽象模式定義classCObservable;//觀察者,純虛基類classCObserver{public:CObserver::CObserver(){};virtualCObserver::~CObserver(){};//當被觀察的目標發生變化時,通知調用該方法//來自被觀察者pObs,擴展參數為pArgvirtualvoidUpdate(CObservable*pObs,void*pArg=NULL)=0;};//被觀察者,即SubjectclassCObservable{public:CObservable():m_bChanged(false){};virtual~CObservable(){};//注冊觀察者voidAttach(CObserver*pObs);//注銷觀察者voidDetach(CObserver*pObs);//注銷所有觀察者voidDetachAll();//若狀態變化,則遍歷觀察者,逐個通知更新voidNotify(void*pArg=NULL);//測試目標狀態是否變化boolHasChanged();//獲取觀察者數量intGetObserversCount();protected://設置狀態變化!!!必須繼承CObservable才能設置目標狀態voidSetChanged();//初始化目標為未變化狀態voidClearChanged();private:boolm_bChanged;//狀態set<CObserver*>m_setObs;//set保證目標唯一性};/////////////////////抽象模式實現voidCObservable::Attach(CObserver*pObs){if(!pObs)return;m_setObs.insert(pObs);}voidCObservable::Detach(CObserver*pObs){if(!pObs)return;m_setObs.erase(pObs);}voidCObservable::DetachAll(){m_setObs.clear();}voidCObservable::SetChanged(){m_bChanged=true;}voidCObservable::ClearChanged(){m_bChanged=false;}boolCObservable::HasChanged(){returnm_bChanged;}intCObservable::GetObserversCount(){returnm_setObs.size();}voidCObservable::Notify(void*pArg/*=NULL*/){if(!HasChanged())return;cout<<notifyobservers…<<endl;ClearChanged();set<CObserver*>::iteratoritr=m_setObs.begin();for(;itr!=m_setObs.end();itr++){(*itr)->Update(this,pArg);}}/////////////////////具體應用類定義和實現//bloger是發布者,即被觀察者(subject)classCBloger:publicCObservable{public:voidPublish(conststring&strContent){cout<<blogerpublish,content:<<strContent<<endl;SetChanged();Notify(const_cast<char*>(strContent.c_str()));}};//portal是發布者,即被觀察者(subject)classCPortal:publicCObservable{public:voidPublish(conststring&strContent){cout<<portalpublish,content:<<strContent<<endl;SetChanged();Notify(const_cast<char*>(strContent.c_str()));}};//RSS閱讀器,觀察者classCRSSReader:publicCObserver{public:CRSSReader(conststring&strName):m_strName(strName){}virtualvoidUpdate(CObservable*pObs,void*pArg=NULL){char*pContent=static_cast<char*>(pArg);//觀察多個目標if(dynamic_cast<CBloger*>(pObs)){cout<<m_strName<<updatedfrombloger,content:<<pContent<<endl;}elseif(dynamic_cast<CPortal*>(pObs)){cout<<m_strName<<updatedfromportal,content:<<pContent<<endl;}}private:stringm_strName;};//Mail閱讀器,觀察者classCMailReader:publicCObserver{public:CMailReader(conststring&strName):m_strName(strName){}virtualvoidUpdate(CObservable*pObs,void*pArg=NULL){char*pContent=static_cast<char*>(pArg);if(dynamic_cast<CBloger*>(pObs)){cout<<m_strName<<updatedfrombloger,content:<<pContent<<endl;}if(dynamic_cast<CPortal*>(pObs)){cout<<m_strName<<updatedfromportal,content:<<pContent<<endl;}}private:stringm_strName;};/////////////////Mainintmain(){//目標(被觀察者)CBloger*pBloger=newCBloger();CPortal*pPortal=newCPortal();//觀察者.一個觀察者可以觀察多個目標CRSSReader*pRssReader=newCRSSReader(rssreader);CMailReader*pMailReader=newCMailReader(mailreader);pBloger->Attach(pRssReader);//bloger注冊觀察者pBloger->Attach(pMailReader);//bloger注冊觀察者pPortal->Attach(pRssReader);//portal注冊觀察者pPortal->Attach(pMailReader);//portal注冊觀察者//博客發布信息pBloger->Publish(博客分享設計模式);cout<<endl;//門戶發布信息pPortal->Publish(門戶分享設計模式);cout<< portaldetachedmailreader<<endl;pPortal->Detach(pMailReader);cout<<portalobserverscount:<<pPortal->GetObserversCount()<<endl<<endl;pPortal->Publish(門戶分享設計模式);system(pause);return0;}

❽ 觀察者模式的基本簡介

觀察者模式(Observer)完美的將觀察者和被觀察的對象分離開。舉個例子,用戶界面可以作為一個觀察者,業務數據是被觀察者,用戶界面觀察業務數據的變化,發現數據變化後,就顯示在界面上。面向對象設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個對象只做一件事情,並且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應用程序的可維護性和重用性。
觀察者設計模式定義了對象間的一種一對多的依賴關系,以便一個對象的狀態發生變化時,所有依賴於它的對象都得到通知並自動刷新。

❾ 觀察者模式在實際用的多嗎

觀察者模式用的太多了。
分類: java設計模式

一.觀察者模式的定義
定義對象間一種一對多的依賴關系,是的沒當一個對象改變狀態,則所有依賴於它的對象都會得到通知並自動更新。

二.觀察者模式的使用場景
(1).關聯行為場景,需要注意的是,關聯行為是可拆分的,而不是「組合」關系

(2).事件多級觸發場景

(3).跨系統的消息交換場景,如消息隊列,事件匯流排的處理機制。

三.觀察者模式的UML類圖
角色介紹:

subject:抽象主題(Observer),也就是被觀察observable的角色,抽象主題角色把所有觀察者對象的引用保存在一個集合里,每個主題都可以有任意數量的觀察者,抽象主題提供一個介面,可以增加或刪除觀察者對象。

concreteSubject:具體主題(ConcreteObservable),該角色將有關狀態存入具體觀察對象,在具體主題的內部狀態發生改變時,給所有注冊過的觀察者發出通知,具體主題角色又叫具體被觀察這(ConcreteObservable)角色

observale:抽象觀察者,該角色是觀察者的抽象類,它定義了更新介面,使得在得到主題的更改通知時更新自己。

ConcreteObserver:具體的觀察者,該角色實現抽象觀察者角色所定義的更新介面,以便在主題的狀態發生變化時更新自身的狀態。

❿ 什麼是觀察者模式(Observer)

觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,讓他們能夠自動更新自己 觀察者模式的組成 抽象主題角色:把所有對觀察者對象的引用保存在一個集合中,每個抽象主題角色都可以有任意數量的觀察者。抽象主題提供一個介面,可以增加和刪除觀察者角色。一般用一個抽象類或介面來實現。 抽象觀察者角色:為所有具體的觀察者定義一個介面,在得到主題的通知時更新自己。 從AWT1.1開始圖形系統的事件模型採用觀察者模式,因此觀察者模式在Java語言中的地位極其重要 在xml解析中的SAX也採用了觀察者模式來實現 Java也提供了對觀察者模式的內置支持 Observable類用於創建可以觀測到你的程序中其他部分的子類。當這種子類的對象發生變化時,觀測類被通知。觀測類必須實現定義了update(