1.观察者模式定义了多个对象之间一对多的依赖关系。当一个对象状态发生改变时,会通知所有依赖它的对象,其它依赖它的对象会根据其状态的变化随着发生改变。
2.(1)目标对象(Subject)对应多个观察者(Observer),提供注册和删除观察者依赖关系的接口,并当状态发生改变时通知观察着状态的改变。
(2)观察者需要当接受到目标通知时,提供自身状态的接口。
3.代码实现
(1)目标对象接口
public interface Subject {
void addObserver(Observer observer); //建立与Observer关联
void removeObserver(Observer observer); //解除与Observer关联
void notifyOberver(); //通知Observer状态的改变
}
(2)观察者接口
public interface Observer {
void update(); //接收目标对象通知,并改变自身状态
}
(3)目标对象的实现类
public class SubjectImpl implements Subject {
private List<Observer> observers = new ArrayList<>(); //观察者集合
@Override
public void addObserver(Observer observer) {
observers.add(observer); //添加观察者
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer); //删除观察者
}
@Override
public void notifyOberver() {
for (int i=0;i<observers.size();i++){ //遍历集合,通知所有观察者
observers.get(i).update();
}
}
}
(4)这里观察者实现类,定义了三个OneObserver,TwoObserver和ThreeObserver,update()方法只是打印了Log.
OneObserver
public class OneObserver implements Observer {
private static final String TAG = OneObserver.class.getSimpleName();
@Override
public void update() {
Log.v(TAG,"oneObserver"); //接收到通知的操作
}
}
public class TwoObserver implements Observer {
private static final String TAG = TwoObserver.class.getSimpleName();
@Override
public void update() {
Log.v(TAG,"TwoObserver");
}
}
ThreeObserver
public class ThreeObserver implements Observer {
private final static String TAG = ThreeObserver.class.getSimpleName();
@Override
public void update() {
Log.v(TAG,"ThreeObserver");
}
}
(5)观察者模式的使用
//建立三个观察者对象
OneObserver oneObserver = new OneObserver();
TwoObserver twoObserver = new TwoObserver();
ThreeObserver threeObserver = new ThreeObserver();
//建立观察者和目标对象的关系
Subject subject = new SubjectImpl();
subject.addObserver(oneObserver);
subject.addObserver(twoObserver);
subject.addObserver(threeObserver);
//当目标对象状态发生改变时,通知观察者
subject.notifyOberver();