观察者模式定义了一对多的依赖,这样一来,当一个对象状态时,他的所有依赖着都会收到通知并自动更新。
观察者模式有点像你订阅博客,当你所关注的博客更新时,你会自动收到更新的列表。那个博客就是主题(Subject),你就是观察者(Observer)。
观察者模式的一般实现如下:
代码实现如下:
Subject
interface Subject{ void registerObserver(Observer o); void deleteObserver(Observer o); void notifyObserver(); }
Observer
interface Observer{ void update(); }
ConcreteSubject
class ConcreteSubject implements Subject{ ArrayList observerList; //观察者注册列表 public ConcreteSubject(){ observerList = new ArrayList(); } public void registerObserver(Observer o){ observerList.add(o); } public void deleteObserver(Observer o){ int i = observerList.indexof(o); if(i>=0){ observerList.remove(i); } } public void notifyObserver(){ for(Object x:observerList){ (Observer)x.update(); } } }
ConcreteObserver
class ConcreteObserver implements Observer{ Subject subject; public ConcreteObserver(Subject subject){ this.subject = subject; //把观察者注册到主题 this.subject.registerObserver(this); } public void update(){ //写入更新的信息 } }
当ConcreteSubject有新的信息要更新时,ConcreteSubject只需调用notifyObserver()就可以使所有的观察者都收到更新。
java中还在java.util中提供了观察者模式。
主题:继承java.util.Observerable
对象:实现java.util.Oberser
实现代码如下:
主题
package Observer; import java.util.Observable; public class ConcreteSubject extends Observable { public String getName() { return name; } public int getAge() { return age; } private String name; private int age; public ConcreteSubject() { } public void update() { this.setChanged(); this.notifyObservers(); } public void setUpdate(String name, int age) { this.name = name; this.age = age; this.update(); } }
观察者
package Observer; import java.util.Observable; import java.util.Observer; public class ConcreteObserver implements Observer { Observable observerable; private String name; private int age; public ConcreteObserver(Observable observerable){ this.observerable = observerable; this.observerable.addObserver(this); } @Override public void update(Observable o, Object arg) { if(o instanceof ConcreteSubject){ ConcreteSubject concreteSubject=(ConcreteSubject)o; this.name = concreteSubject.getName(); this.age = concreteSubject.getAge(); } display(); } private void display() { System.out.println("姓名:"+this.name+" 年龄:"+this.age); } }
观察者模式就使观察者实时收到主题的更新!