定义
定了了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新
在具体实现中,开发者可以自己定义一整套观察者框架,也可以利用java提供的api实现这个模式
自定义实现观察者模式
观察者模式主要在解耦方面有巨大的作用,开发者可以自己实现整个观察者模式框架,一般会实现了观察者接口,这个接口的必需的一个方法是提供 主题(被观察者)状态发生变化时,需要调用的,像Observer接口中的receiverNews方法
public interface Observer {
public void receiverNews(News news);
}
主题接口一般最少提供三个方法,一个观察者注册接口,一个移除接口,一个通知接口。
所有主题类必需实现该接口。具体的代码见我的github代码
依赖JDK实现观察者模式
利用java api
被观察者实现类需要extends Observable,观察者需要implements Observer接口
被观察者发布新状态需要先调用setChanged(),然后调用notifyObservers()。这里setChanged方法存在的意义是为了 规避当被观察者数据虽然更新了,但数据其实是没变的。例如一个天气系统,第一次被观察者更新温度数据21°,通知其订阅者,订阅者收到消息后作出相应的改变,第二次被观察者更新的温度数据还是21°,这时候就没必要在发送(当然这个根据你的业务,如果系统要求不变也得发送那你就可以忽视了)。
notifyObservers方法是通知所有订阅者的方法,可以将发送的数据放在这个方法里。
所有的观察者都要实现observer接口并且必需复写其update方法,
@Override
public void update(Observable topic, Object content) {
if(topic instanceof NewsOfficeJDK){
System.out.println("alice received a news about "+ ((News)content).getTitle()+" from "+((NewsOfficeJDK)topic).getName());
}else if(topic instanceof JavaOfficeJDK){
System.out.println("alice received a news about "+ ((News)content).getTitle()+" from Java ");
}
}
第一个参数Observable是消息的发送者,第二个参数时消息内容。
感觉利用jdk实现观察者模式是很不方便的,并且被观察者必需继承Observable类,其实自己实现这个模式代价可以忽略不计,而且可以随意修改。
观察者模式提示是挺好理解的,就简答的讲述这么多。