观察者模式


观察者模式定义了对象之间的一对多依赖,当一个对象改变时,所以依赖于它的对象都会得到通知。

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 编程时,我们想要在事件被触发时,执行我们指定的动作。例如想在按钮被点击时弹窗口,就可以通过类似 AddListener,将已经实现相应接口的对象添加到按钮的“订阅列表”中,当按钮被点击时,系统会依次调用“订阅列表”中对象的相应方法。弹窗口因此被触发。