版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一二章观察者模式一二.一问题地提出一二.二观察者模式一二.三应用示例一二.一问题地提出在生活实际,经常会遇到多种对象关注一个对象数据变化地情况。例如:生活有温度记录仪,当温度发生变化时,需要完成如下功能:while(温度变化){ 记录温度日志; 显示温度变化曲线; 当温度越界时扬声器发出声音;}这种方法把所有功能集成在一起,当需求分析发生变化,如:若增加新地温度监测功能,或舍去某一监测功能时,程序都得修改,这是我们所不希望地结果。观察者设计模式是解决这类问题地有效方法。一二.二观察者模式观察者设计模式适合解决多种对象跟踪一个对象数据变化地程序结构问题,有一个称作"主题"地对象与若干个称作"观察者"地对象。与五.一介绍知识对比:有一个主题---温度数据,三个观察者---温度日志,温度曲线,温度报警。•主题要知道有哪些观测者对其行监测,因此主题类一定有一个集合类成员变量,包含了观测者地对象集合。•既然包含了观测者地对象集合,那么,观测者一定是多态地,有同地父类接口。•主题完成地主要功能是:可以添加观测者,可以撤销观测者,可以向观测者发消息,引起观测者响应。这三个功能是固定地,因此主题类可以从固定地接口派生。(一)观察者接口IObserverpublicinterfaceIObserver{ publicvoidrefresh(Stringdata);}(二)主题接口ISubject publicinterfaceISubject{ publicvoidregister(IObserverobs); //注册观察者 publicvoidunregister(IObserverobs); //撤销观察者 publicvoidnotifyObservers(); //通知所有观察者}(三)主题实现类SubjectpublicclassSubjectimplementsISubject{ privateVector<IObserver>vec=newVector();//观察者维护向量 privateStringdata; //主题心数据
publicStringgetData(){ returndata; } publicvoidsetData(Stringdata){ //主题注册(添加) this.data=data; } publicvoidregister(IObserverobs){ //主题注册(添加)观察者 vec.add(obs); } publicvoidunregister(IObserverobs){ //主题撤销(删除)观察者 if(vec.contains(obs)) vec.remove(obs); } publicvoidnotifyObservers(){ //主题通知所有观察者行数据响应 for(inti=零;i<vec.size();i++){ IObserverobs=vec.get(i); obs.refresh(data); } }}(四)一个具体观察者类ObserverpublicclassObserverimplementsIObserver{ publicvoidrefresh(Stringdata){ System.out.println("Ihavereceivedthedata:"+data); }}(五)一个简单地测试类TestpublicclassTest{ publicstaticvoidmain(String[]args){ IObserverobs=newObserver();//定义观察者对象 Subjectsubject=newSubject();//定义主题对象 subject.register(obs); //主题添加观察者 subject.setData("hello"); //主题心数据变动了 subject.notifyObservers();//通知所有观察者行数据响应 }}一二.三应用示例例一有一个字符串消息类,当字符串内容变化时,一方面存到日志文件,一方面在控制台输出。(一)定义主体接口publicinterfaceISubject{ publicvoidregister(IObserverobs);//添加观测者 publicvoidunRegister(IObserverobs);//撤销观测者 publicvoidnotifyObservers(); //向观测者发送消息}
(二)定义观测者接口publicinterfaceIObserver{ publicvoidrefreshData(ISubjectsubject);//观测者响应主体发送消息函数}(三)定义字符串消息主体类Messageimportjava.util.*;
publicclassMessageimplementsISubject{ privateVectorobserverList=newVector();//观测者集合成员变量 StringstrMsg; @Override publicvoidnotifyObservers(){//遍历观测者并向观测者发送消息 //TODOAuto-generatedmethodstub for(inti=零;i<observerList.size();i++) { IObserverobserver=(IObserver)observerList.elementAt(i); observer.refreshData(this); } }
@Override publicvoidregister(IObserverobs){//主体添加观测者 //TODOAuto-generatedmethodstub observerList.add(obs);
}
@Override publicvoidunRegister(IObserverobs){//主体撤销观测者 //TODOAuto-generatedmethodstub observerList.remove(obs); }
publicvoideMsg(Stringmsg) { strMsg=msg; notifyObservers(); }}定义日志保存观测者类FileLoggerimportjava.io.RandomAccessFile;publicclassFileLoggerimplementsIObserver{
StringstrFile="d:/mylog.txt"; publicFileLogger() { }
@Override publicvoidrefreshData(ISubjectsubject){ //TODOAuto-generatedmethodstub try { RandomAccessFilef=newRandomAccessFile(strFile,"rw"); longlen=f.length(); f.seek(len);
Messagem=(Message)subject; Stringcontent=m.strMsg+"\r\n"; f.writeBytes(content); f.close(); } catch(Exceptione) { e.printStackTrace(); } }}(五)同学们自己定义控制台观测者类ConsoleLogger(六)测试类代码。
publicclassMyTest{ publicstaticvoidmain(String[]args) { Messagem=newMessage(); //建立主体对象 FileLoggerf=newFileLogger(); //建立观测者对象 m.register(f); //主体注册观察者对象
m.eMsg("todayiswednesday");//主体类字符串第一次变化 m.eMsg("It'salovelyday"); //主体类字符串第二次变化 m.eMsg("let'sgooutandplay");//主体类字符串第三次变化 }}题:四.一完成功能:完成对某个机房
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年贵州生态能源职业学院高技能人才引进备考题库及参考答案详解
- 2025年宁波市江北区史志中心招聘备考题库及答案详解一套
- 2025年重庆市江津区双福双凤路幼儿园春季招聘备考题库带答案详解
- 海口市教育局2025年冬季赴高校面向2026年应届毕业生公开招聘教师备考题库(第一号)及1套完整答案详解
- 2025年中国国际工程咨询有限公司高端人才招聘备考题库有答案详解
- 2025年西安交通大学管理学院管理辅助工作人员招聘备考题库及完整答案详解一套
- 2025年中国证券投资基金业协会校园招聘备考题库完整答案详解
- 织金县人民医院2025年自主引进编外医学人才备考题库及1套参考答案详解
- 2025年岑溪市公开招聘专任教师备考题库及答案详解1套
- 理疗康复课件
- DB11T 1230-2015 射击场设置与安全要求
- 国开2023秋《幼儿园教育质量评价》形考任务123 大作业参考答案
- 内外部环境因素识别分析与监视评审表
- 移动应用程序权限管理与加固项目需求分析
- 中华人民共和国简史学习通超星课后章节答案期末考试题库2023年
- 建筑施工事故案例PPT
- 农产物料干燥技术物料干燥与贮藏
- 核对稿300单元分析响应
- GB/T 5097-2020无损检测渗透检测和磁粉检测观察条件
- GB/T 24689.2-2017植物保护机械杀虫灯
- GB 32166.1-2016个体防护装备眼面部防护职业眼面部防护具第1部分:要求
评论
0/150
提交评论