介绍:多个对象想知道一个对象中数据变化情况的一种模式
主题:定义一个接口,包含具体主题需要实现的一些方法,可以添加具体观察者
具体主题:实现主题接口,有通知具体观察者数据更新的方法
观察者:定义一个接口
具体观察者:实现观察者接口,有主题接口的一个引用,便于主题删除或者添加观察者
主题 : Subject.java
public interface Subject{
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifyObservers();
}
Obsever.java
public interface Observer{
public void hearTelephone(String heardMess);
}
具体主题 SeekJobCenter.java_1
import java.util.ArrayList;
public class SeekJobCenter implements Subject{
String mess;
boolean changed;
ArrayList<Observer> personList;
SeekJobCenter(){
personList=new ArrayList<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);
}
具体主题 SeekJobCenter.java_2
public void notifyObservers(){
if(changed){for(int i=0;i<personList.size();i++){
Observer observer=personList.get(i);
observer.hearTelephone(mess); }
changed=false;
}
}
public void giveNewMess(String str){
if(str.equals(mess))
changed=false;
else{
mess=str;
changed=true;
}
}
}
具体观察者_1 UniversityStudent.java
import java.io.*;
public class UniverStudent implements Observer{
Subject subject;
File myFile;
UniverStudent(Subject subject,String fileName){
this.subject=subject;
subject.addObserver(this); //使当前实例成为subject所引用的具体主题的观察者
myFile=new File(fileName);
}
public void hearTelephone(String heardMess){
try{ RandomAccessFile out=new RandomAccessFile(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());
}
}
}
具体观察者_1 UniversityStudent.java
import java.io.*;
public class UniverStudent implements Observer{
Subject subject;
File myFile;
UniverStudent(Subject subject,String fileName){
this.subject=subject;
subject.addObserver(this); //使当前实例成为subject所引用的具体主题的观察者
myFile=new File(fileName);
}
public void hearTelephone(String heardMess){
try{ RandomAccessFile out=new RandomAccessFile(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());
}
}
}
应用 Application.java
public class Application{
public static void main(String args[]){
SeekJobCenter center=new SeekJobCenter();
UniverStudent zhangLin=new UniverStudent(center,"A.txt");
HaiGui wangHao=new HaiGui(center,"B.txt");
center.giveNewMess("腾辉公司需要10个java程序员。");
center.notifyObservers();
center.giveNewMess("海景公司需要8个动画设计师。");
center.notifyObservers();
center.giveNewMess("仁海公司需要9个电工。");
center.notifyObservers();
center.giveNewMess("仁海公司需要9个电工。");
center.notifyObservers();
}