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(); } }