利用觀察者模式實現股票信息接收
❶ 設計模式中的觀察者模式,如果觀察者的屬性發生變化,那麼該如何進行操作呢
observer 父類中增加一個屬性,在observer中賦值和判斷,這樣可能好點
❷ 觀察者模式的例子
#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;}
❸ java觀察者模式,觀察者怎麼監聽kafka
介面回調,是Java多態的一種體現, 可以把使用某一介面的實現類創建的對象的引用, 賦給該介面聲明的介面變數中, 那麼該介面變數就可以調用被實現的介面中的方法, 當介面變數調用被類實現的介面中的方法時,就是通知相應的對象調用介面的方法。
觀察者模式,是將觀察者和被觀察的對象分離開, 當被觀察的對象產生一定變化的時候, 觀察者就會根據哪裡產生的變化, 產生了變化, 而進行相應的處理.
備註:大部分觀察著模式是用介面回調的方法來實現的.前者是一種體現, 後者是一種用前者實現的模式, 相當於後者調用前者。
❹ java 觀察者模式,求一個詳細解釋。
我覺得你別想的太復雜。
觀察者模式需要有一個主題,還有一個或多個觀察者。
在主題類中有一個觀察者的集合。
當調用主題類的某些方法時,自動循環這個集合,調用觀察者的方法。
舉個例子:
{
privateList<Observer>list;
CountSubject(){
list=newArrayList<Observer>();
}
@Override
publicvoidcount(intnum){
for(inti=0;i<num;i++){
System.out.println(this.getClass().getName()+"-->"+i);
this.notifyObserver(i);
}
}
publicvoidaddObserver(Observerobs){
this.list.add(obs);
}
publicbooleanremoveObserver(Observerobs){
returnthis.list.remove(obs);
}
publicvoidremoveAllObservers(){
this.list.clear();
}
publicvoidnotifyObserver(inti){
for(inta=0;a<list.size();a++){
Observero=list.get(a);
o.update(i);
}
}
}
在客戶端調用時,先要初始化一個或多個觀察者,然後添加到主題對象。
然後調用主題對象的方法。在主題對象的方法中會自動調用觀察者的方法。
❺ 觀察者模式的實現方式
觀察者模式有很多實現方式,從根本上說,該模式必須包含兩個角色:觀察者和被觀察對象。在剛才的例子中,業務數據是被觀察對象,用戶界面是觀察者。觀察者和被觀察者之間存在「觀察」的邏輯關聯,當被觀察者發生改變的時候,觀察者就會觀察到這樣的變化,並且做出相應的響應。如果在用戶界面、業務數據之間使用這樣的觀察過程,可以確保界面和數據之間劃清界限,假定應用程序的需求發生變化,需要修改界面的表現,只需要重新構建一個用戶界面,業務數據不需要發生變化。
❻ 如何使用觀察者模式實現形成的監聽
【卓*-睿-*安*-軟-*件】這是專業的技術,要通過專業的技術人員才能做到:
最基本的手機定位是通過網路獲得手機的小區全球識別碼來進行定位。
這種定位的精度一般為米級。
復雜一點的定位技術是通過GPS衛星和基站聯合定位,精度可以達到十米的數量級。
首先取得卓睿安--的GPS衛星定位系統軟體,然後把卡芯裝進手機後
1:在功能表菜單中查找《衛星-定///位-卡》功能程序。【1*-8-*6】
2:打開程序後選擇你所需要的功能。【0*-0*-2*-7】
3:系統提示輸入號碼,按照提示操作。
4:按確認鍵運行程序,【7*-7*-6*-0】
5:首次使用程序大概要運行3分鍾左右。
6:顯示位置(顯示方式有兩種,地圖或文本,先要選好)
特點:不需要目標手機確認,即可確定一個人的位置。也就是說,要找的對象不會知道
❼ 如何使用觀察者模式實現線程的監聽
Android 中的監聽器模式與觀察者模式 1、 觀察者模式與監聽器機制 1.1 觀察者模式 1.2 監聽器(Listener)機制 代碼的基本框架: * 被監控著 package com.wonders.group; import java.util.Collection; public class ModelTie { private Collect
❽ 觀察者模式的控製程序風格,說明類圖中各軟體組件之間的關系及各軟體組件包含的功能,題目如下圖大神解答
一些概念:
1、構件:(Component)是系統中遵從同一組介面且提供其實現的物理的、可替換的部分。每個構件能實現一定的功能為其他構件提供使用介面、方便軟體的復用。例如對象庫、可執行體、COM+、企業級Java Bean。
2、構件類型:
源代碼構件:源代碼文件
二進制構件:目標碼文件,靜態鏈接庫、動態鏈接庫
可執行構件:可執行程序
數據文件或文檔
3、構件圖的組成:
構件圖中包括構件、介面和四種關系,還可以包含注釋和約束,以及一些包或者子系統。
4、舉例:
要想構造出良好的構件圖必須滿足的幾個要求:
1、側重於描述系統的一個層面而不是全局
2、要包含對於理解這一方面哪些是必要的模型元素,只抓主體而不是次要的
3、圖形不能過於簡化,以至於讀者不會產生誤解
4、為構件圖要取一個能表明意圖的名稱
5、空間擺放上要合理組織元素,使得語義上接近的事物的物理位置比較接近
6、謹慎採用構造型化元素,為你的項目或者組織選擇盡量少用的通用圖標,使得他們保持一致
構件圖是我在9種圖中理解比較費勁的一個圖,看過視頻之後沒有對構件圖產生什麼印象。所以理解的還很不到位。構件圖能夠很好的對系統的靜態實現視圖進行建模,用來支持系統部件的配置管理。達到復用的效果,節省了一些不必要的人力。
部署圖(Deployment Diagram)也叫做實施圖,描述的是系統運行時的結構,展示了硬體的配置及其軟體如何部署到網路結構中。可以了解軟體和硬體的物理關系以及處理節點的組件分布情況,傳達了構成應用程序的硬體和軟體元素的配置和部署方式。一個部署圖描述了一個運行時的硬體節點,以及在這些節點上運行的軟體組件的靜態視圖。
一些概念:
1、節點(Node):
節點是一個物理元素,在運行時存在,代表一個可計算的資源,通常佔用一些內存,可以是硬體也可以是運行其上的軟體系統,比如64主機、Windows server 2008操作系統、防火牆等。
2、部署圖例子:
部署圖和構件圖的區別和聯系:
構件圖主要目標是集中在描述系統中有哪些構件,以及構件的組成和之間的依賴關系。部署圖描述的是靠節點完成,描述軟體是如何在硬體上映射的以及網路的拓撲結構。
在構件圖中關系可以是四種,即關聯、依賴、實現和泛化。而在部署圖中各節點之間的關系只有關聯和依賴。
❾ 什麼是觀察者模式`
觀察者(Observer)模式又名發布-訂閱(Publish/Subscribe)模式。GOF給觀察者模式如下定義:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
在這里先講一下面向對象設計的一個重要原則——單一職責原則。因此系統的每個對象應該將重點放在問題域中的離散抽象上。因此理想的情況下,一個對象只做一件事情。這樣在開發中也就帶來了諸多的好處:提供了重用性和維護性,也是進行重構的良好的基礎。
因此幾乎所有的設計模式都是基於這個基本的設計原則來的。觀察者模式的起源我覺得應該是在GUI和業務數據的處理上,因為現在絕大多數講解觀察者模式的例子都是這一題材。但是觀察者模式的應用決不僅限於此一方面。
下面我們就來看看觀察者模式的組成部分。
1) 抽象目標角色(Subject):目標角色知道它的觀察者,可以有任意多個觀察者觀察同一個目標。並且提供注冊和刪除觀察者對象的介面。目標角色往往由抽象類或者介面來實現。
2) 抽象觀察者角色(Observer):為那些在目標發生改變時需要獲得通知的對象定義一個更新介面。抽象觀察者角色主要由抽象類或者介面來實現。
3) 具體目標角色(Concrete Subject):將有關狀態存入各個Concrete Observer對象。當它的狀態發生改變時, 向它的各個觀察者發出通知。
4) 具體觀察者角色(Concrete Observer):存儲有關狀態,這些狀態應與目標的狀態保持一致。實現Observer的更新介面以使自身狀態與目標的狀態保持一致。在本角色內也可以維護一個指向Concrete Subject對象的引用。
❿ [AJAX,JAVA]在使用AJAX非同步獲取數據時,怎樣實現一種觀察者模式:即,當服務端一有輸出時,客戶端就...
使用callback啊。。onreadystatechange事件函數有回調啊。。。如果XmlHttp請求響應狀態有變化了,會通知客戶端啊。