观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式在对象之间存在一对多关系时使用,例如,如果一个对象被修改,它的依赖对象将被自动通知。
首先建立观察者:
观察者接口,这样才能在被观察者通过多态注入多个观察者
public interface Observer {
public void update();
}
实现观察者接口,两个具体的观察者
public class Observer001 implements Observer {
@Override
public void update() {
System.out.println("observer1 has received!");
}
}
public class Observer002 implements Observer {
@Override
public void update() {
System.out.println("observer2 has received!");
}
}
建立被观察者接口
public interface Subject {
//增加观察者
public void add(Observer observer);
//删除观察者
public void del(Observer observer);
//通知所有观察者
public void notifyObservers();
public void operation();
}
抽象被观察者类
public abstract class AbstractSubject implements Subject {
//接受所有的观察者
//注入目标对象的依赖对象Observer
private Vector<Observer> vector = new Vector<Observer>();
@Override
public void add(Observer observer) {
vector.add(observer);
}
@Override
public void del(Observer observer) {
vector.remove(observer);
}
@Override
public void notifyObservers() {
Enumeration<Observer> enumo = vector.elements();
while (enumo.hasMoreElements()) {
enumo.nextElement().update();
}
}
}
具体的被观察者
public class MySubject extends AbstractSubject {
@Override
public void operation() {
System.out.println("update self!");
notifyObservers();
}
}
测试:创建一个被观察者 MySubject,为其注入两个观察者,当被观察者执行operation操作时候,通知两个观察者。
public class Test {
public static void main(String[] args) {
Subject sub = new MySubject();
sub.add(new Observer001());
sub.add(new Observer002());
sub.operation();
}
}
结果: