观察者模式定义了对象之间的一对多依赖,当一个对象改变时。所以依赖于它的对象都会得到通知。
interface Observer {
void update(int data);
}
class NewsPaper {
private LinkedList<Observer> observers;
public NewsPaper() {
observers = new LinkedList<>();
}
public void subscribe(Observer o) {
observers.add(o);
}
public void unsubscribe(Observer o) {
observers.remove(o);
}
public void changeData(int data) {
for (Observer o : observers) {
o.update(data);
}
}
}
class Reader implements Observer {
private String name;
public Reader(NewsPaper paper, String name) {
this.name = name;
paper.subscribe(this);
}
@Override
public void update(int data) {
System.out.println(name + " update data:" + data);
}
}
public class TestObserve {
public static void main(String[] args) {
NewsPaper newsPaper = new NewsPaper();
Reader tom = new Reader(newsPaper, "tom");
Reader jack = new Reader(newsPaper, "jack");
newsPaper.changeData(10);
System.out.println("--");
newsPaper.unsubscribe(tom);
newsPaper.changeData(5);
}
}
全部 Reader 都是观察者,当他订阅了 NewsPaper 后。NewsPaper 一有新数据,就会通知全部订阅了它的 Reader。
为什么要使用观察者模式?由于在初始化被观察者时,并不知道当数据变化时。须要通知谁。
须要通知的对象是动态变化的。
在 GUI 编程时。我们想要在事件被触发时,运行我们指定的动作。
比如想在button被点击时弹窗体。就能够通过类似AddListener
。将已经实现对应接口的对象加入到button的“订阅列表”中。当button被点击时,系统会依次调用“订阅列表”中对象的对应方法。弹窗体因此被触发。