设计模式观察者模式_第1页
设计模式观察者模式_第2页
设计模式观察者模式_第3页
设计模式观察者模式_第4页
设计模式观察者模式_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一二章观察者模式一二.一问题地提出一二.二观察者模式一二.三应用示例一二.一问题地提出在生活实际,经常会遇到多种对象关注一个对象数据变化地情况。例如:生活有温度记录仪,当温度发生变化时,需要完成如下功能: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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论