利用观察者模式实现股票信息接收
❶ 设计模式中的观察者模式,如果观察者的属性发生变化,那么该如何进行操作呢
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请求响应状态有变化了,会通知客户端啊。