Observer模式属于行为模式,是为了定义对象间的一种一对多的关系。当一个对象的状态发生改变时,所有依赖它的对象都将得到通知,并自动更新。模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。
【实例】老师有电话号码,学生需要知道老师的电话号码以便在需要的时候拨打,在这样的模式中,老师就是一个被观察者(Subject),学生就是需要知道信息的观察者。当老师的电话号码发生改变时,学生会得到通知,并更新相应的电话记录。
如图所示:
用Java代码实现:
public interface IObServer {
public void update(String msg);
}
public class Student implements IObServer {
private String student_name;
public Student(String name){
student_name = name;
}
@Override
public void update(String msg) {
// TODO Auto-generated method stub
System.out.println(student_name + ":\t" + msg);
}
}
public interface ISubject {
//添加一个通知
public void add(IObServer o);
//移除一个通知
public void del(IObServer o);
//执行下达通知的指令
public void notice();
}
import java.util.ArrayList;
public class Teacher implements ISubject {
//定义students:所有学生
private ArrayList<IObServer> students = new ArrayList<IObServer>();
private String msg = "";//老师要发出的信息
public void setMsg(String new_msg){
msg = new_msg;
}
@Override
public void add(IObServer o) {
students.add(o);
}
@Override
public void del(IObServer o) {
students.remove(o);
}
@Override
public void notice() {
for(int i=0;i<students.size();i++){
students.get(i).update(msg);
}
}
}
public class Test {
public static void main(String[] args) {
ArrayList<IObServer> students = new ArrayList<IObServer>();
Teacher t = new Teacher();
for(int i=1;i<=10;i++){
Student s = new Student("aa"+i);
students.add(s);
t.add(s);
}
t.setMsg("phone:123456789");
t.notice();
System.out.println("-----把其中几个学生移除接收通知的范围-----------");
for(int i=0;i<students.size();i++){
if(i%2==0){
t.del(students.get(i));
}
}
t.notice();
}
}