概述:定义对象间的一对多的依赖关系,当一个对象发生改变时,所以依赖它的对象得到通知并作出相应更新。
适应场景:用于一对多依赖关系对象间,当被依赖者变化时,通知依赖者全部进行更新,被依赖者(Subject)应该有添加/删除依赖者(Observer)的方法,且可以把添加的依赖者放到一个容器中,且有一个方法去通知依赖者进行更新(update())。
思想:建立目标(Subject)和观察者(Observer)接口
目标接口:
建立一个注册观察者对象接口 public void attach(Observer o);
建立一个删除观察者对象接口 public void detach(Observer o);
建立一个当目标状态发生改变时,发布通知给观察者对象接口 public void notice();
观察者接口:
建立一个当收到目标通知后的更新接口: public void update();
示例:老师电话号码与学生,老师就是一个目标(Subject),学生就是观察者(Observer),当老师电话号码改变了,就要通知学生,并更新相应的电话记录。
Subject代码:
public interface Subject{
public void attach(Observer o);
public void detach(Observer o);
public void notice();
}
public interface Observer{
public void update();
}
import java.util.Vector;
public class Teacher implements Subject{
private String phone;
private Vector students;
public Teacher(){
phone = "";
students = new Vector();
}
public void attach(Observer o){
students.add(o);
}
public void detach(Observer o){
students.remove(o);
}
public void notice(){
for(int i=0;i<students.size();i++)
((Observer)students.get(i)).update();
}
public void setPhone(String phone){
this.phone = phone;
notice(); --关键
}
public String getPhone(){
return phone;
}
}
public class Student implements Observer{
private String name;
private String phone;
private Teacher teacher;
public Student(String name,Teacher t){
this.name = name;
teacher = t;
}
public void show(){
System.out.println("Name:"+name+"\nTeacher'sphone:"+phone);
}
public void update(){
phone = teacher.getPhone();
}
}
package observer;
import java.util.Vector;
public class Client{ -->可以只定义目标者,观察者,另外的vector,只为了输入结果.
public static void main(String[] args){
Vector students = new Vector();
Teacher t = new Teacher();
for(int i= 0 ;i<10;i++){
Student st = new Student("lili"+i,t);
students.add(st);
t.attach(st);
}
t.setPhone("88803807");
for(int i=0;i<10;i++)
((Student)students.get(i)).show();
t.setPhone("88808880");
for(int i=0;i<10;i++)
((Student)students.get(i)).show();
}
}
参考:http://www.cnblogs.com/hnrainll/archive/2011/12/29/2305582.html