欢迎来到天天文库
浏览记录
ID:14461431
大小:141.50 KB
页数:11页
时间:2018-07-28
《软件体系结构与设计模式 观察者模式》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、观察者模式(别名:依赖,发布-订阅)定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。ObserverPattern(AnotherName:Dependents,Publish-Subscribe)Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically..一、概
2、述在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化。二、模式的结构与使用观察者模式的结构中包括四种角色:•主题(Subject)•观察者(Observer)•具体主题(ConcreteSubject)•具体观察者(ConcreteObserver)模式的结构的描述与使用有一个大学毕业生和一个归国留者都希望能及时知道“求职中心”最新的职业需求信息。1.主题:Subject.javapublicinterfaceSubject{publicvo
3、idaddObserver(Observero);publicvoiddeleteObserver(Observero);publicvoidnotifyObservers();}主题接口规定了具体主题需要实现的添加、删除观察者以及通知观察者更新数据的方法2.观察者:Obsever.javapublicinterfaceObserver{publicvoidhearTelephone(StringheardMess);}观察者接口规定了具体观察者用来更新数据的方法。3.具体主题SeekJobCenter.j
4、ava_1publicclassSeekJobCenterimplementsSubject{Stringmess;booleanchanged;ArrayListpersonList;SeekJobCenter(){personList=newArrayList();mess="";changed=false;}publicvoidaddObserver(Observero){if(!(personList.contains(o)))personList.add(o
5、);}publicvoiddeleteObserver(Observero){if(personList.contains(o))personList.remove(o);}3.具体主题SeekJobCenter.java_2publicvoidnotifyObservers(){if(changed){for(inti=0;i6、anged=false;}}publicvoidgiveNewMess(Stringstr){if(str.equals(mess))changed=false;else{mess=str;changed=true;}}}具体主题通过实现notifyObservers()方法来通知具体观察者,实现的方式是遍历具体主题中用来存放观察者引用的集合,并让集合中的每个具体观察者执行观察者接口规定更新数据的方法。4.具体观察者_1UniversityStudent.javapublicclassUniverStude7、ntimplementsObserver{Subjectsubject;FilemyFile;UniverStudent(Subjectsubject,StringfileName){this.subject=subject;subject.addObserver(this);myFile=newFile(fileName);}publicvoidhearTelephone(StringheardMess){try{RandomAccessFileout=newRandomAccessFile(myFile8、,"rw");out.seek(out.length());byte[]b=heardMess.getBytes();out.write(b);System.out.print("我是一个大学生,");System.out.println("我向文件"+myFile.getName()+"写入如下内容:");System.out.println(heardMess);}catch(IOExceptionexp){
6、anged=false;}}publicvoidgiveNewMess(Stringstr){if(str.equals(mess))changed=false;else{mess=str;changed=true;}}}具体主题通过实现notifyObservers()方法来通知具体观察者,实现的方式是遍历具体主题中用来存放观察者引用的集合,并让集合中的每个具体观察者执行观察者接口规定更新数据的方法。4.具体观察者_1UniversityStudent.javapublicclassUniverStude
7、ntimplementsObserver{Subjectsubject;FilemyFile;UniverStudent(Subjectsubject,StringfileName){this.subject=subject;subject.addObserver(this);myFile=newFile(fileName);}publicvoidhearTelephone(StringheardMess){try{RandomAccessFileout=newRandomAccessFile(myFile
8、,"rw");out.seek(out.length());byte[]b=heardMess.getBytes();out.write(b);System.out.print("我是一个大学生,");System.out.println("我向文件"+myFile.getName()+"写入如下内容:");System.out.println(heardMess);}catch(IOExceptionexp){
此文档下载收益归作者所有