Java:应用Observer接口实践Observer模式:http://zhangjunhd.blog.51cto.com/113473/68949/
观察者模式(别名:依赖,发布-订阅)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。
一 、 概述
在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化。二、 模式的结构与使用
观察者模式的结构中包括四种角色:
1.主题 :Subject.java
public interface Subject{
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifyObservers();
}
2.观察者 :Obsever.java
public interface Observer{
public void hearTelephone(StringheardMess);
}
3.具体主题 SeekJobCenter.java_1
import java.util.ArrayList;
public class SeekJobCenter implements Subject{
String mess;
boolean changed;
ArrayList<Observer>personList; SeekJobCenter(){
personList=newArrayList<Observer>();
mess="";
changed=false;
}
public void addObserver(Observer o){
if(!(personList.contains(o)))
personList.add(o); }
public void deleteObserver(Observer o){
if(personList.contains(o))
personList.remove(o);
}
3.具体主题 SeekJobCenter.java_2
public void notifyObservers(){
if(changed){for(inti=0;i<personList.size();i++){
Observer observer=personList.get(i);
observer.hearTelephone(mess); }
changed=false;
}
}
public void giveNewMess(Stringstr){
if(str.equals(mess))
changed=false;
else{
mess=str;
changed=true;
}
}
}
4.具体观察者_1 UniversityStudent.java
import java.io.*;
public class UniverStudent implementsObserver{
Subject subject;
File myFile;
UniverStudent(Subjectsubject,StringfileName){
this.subject=subject;
subject.addObserver(this); //使当前实例成为subject所引用的具体主题的观察者
myFile=new File(fileName);
}
public void hearTelephone(StringheardMess){
try{ RandomAccessFile out=newRandomAccessFile(myFile,"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(IOException exp){
System.out.println(exp.toString());
}
}
}
4.具体观察者_2 HaiGui.java
import java.io.*;
import java.util.regex.*;
public class HaiGui implementsObserver{
Subject subject;
File myFile;
HaiGui(Subjectsubject,StringfileName){
this.subject=subject;
subject.addObserver(this); //使当前实例成为subject所引用的具体主题的观察者
myFile=new File(fileName);
}
public void hearTelephone(StringheardMess){
try{ boolean boo=heardMess.contains("java程序员")||heardMess.contains("软件");
if(boo){
RandomAccessFile out=newRandomAccessFile(myFile,"rw");
out.seek(out.length());
byte [] b=heardMess.getBytes();
out.write(b);
System.out.print("我是一个海归,");
System.out.println("我向文件"+myFile.getName()+"写入如下内容:");
System.out.println(heardMess);
}
else{
System.out.println("我是海归,这次的信息中没有我需要的信息");
}
}
catch(IOException exp){
System.out.println(exp.toString());
}
}
}
5.应用 Application.java
public class Application{
public static void main(String args[]){
SeekJobCenter center=newSeekJobCenter();
UniverStudentzhangLin=newUniverStudent(center,"A.txt");
HaiGuiwangHao=newHaiGui(center,"B.txt");
center.giveNewMess("腾辉公司需要10个java程序员。");
center.notifyObservers();
center.giveNewMess("海景公司需要8个动画设计师。");
center.notifyObservers();
center.giveNewMess("仁海公司需要9个电工。");
center.notifyObservers();
center.giveNewMess("仁海公司需要9个电工。");
center.notifyObservers();
}
三、观察者模式的优点