一、什么是观察者模式:
观察者模式的定义:
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
这样可能好理解一点:观察者订阅被观察者,被观察者发生改变会通知所有观察者,然后观察者做出相应的行为。
例如:我关注了某明星的微博,该明星每发一条新微博,我就会接到该明星发了一条新微博的通知。
这里我就是观察者,该明星就是被观察者。
观察者模式的本质: 触发联动
二、观察者模式的两种实现方式:
推模型: 1.推模型是假定目标对象知道观察者需要的具体数据。
2.推模型会使观察者对象难以复用拉模型: 1.拉模型是被观察者不知道观察者具体需要什么数据,因此把自身传给观察者,由观察者来取值。
2.拉模型下,update方法的参数是目标对象本,基本上可以适应各种情况的需要也就是说 拉模型会将被观察者本身传给观察者,而推模型会将被观察者本身的某些属性传给观察者。
三、观察者模式的实例:
1、首先,我们需要定义观察者接口,Observer.java
/** * 这是一个观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象 * @author lsy * */ public interface Observer { /** 拉模型 * 更新的接口 * @param weatherSubject 传入目标对象,方便获取相应的目标对象的状态 */ public void update(WeatherSubject weatherSubject); /** 推模型 * 更新的接口 * @param content 传入目标属性 */ public void update(String content); }
2、然后,我们需要定义目标对象(被观察者),我们以天气作为目标对象, WeatherSubject .java
/** * 目标对象(被观察者),它知道它的观察者,并提供注册(添加)和删除观察者的接口 */ public class WeatherSubject { //用来保存注册的观察者对象 private List<Observer> observers = new ArrayList<Observer>(); //attach detach notifyObservers /** * 把订阅天气的人添加到订阅者列表中 * @param observer */ public void arrach(Observer observer) { observers.add(observer); } /**