观察者模式的定义:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
举个例子,有一个服务项目,它就相当于一个对象。而使用这项服务的使用者就是观察者们。服务类中有以下几个方法:注册用户、删除用户、更新消息给用户。 使用者类中有 注册服务、更新信息两个方法。
于是,当服务有新消息时,可以通过更新消息的方法,在这方法中遍历所有的使用者并调用它们的更新信息方法来通知所有的使用者。 当使用者想要订阅服务时,只要通过注册服务方法调用服务类注册用户的方法即可实现。
这样做的好处在于只要服务发布了信息,订阅者就能获取信息,订阅就能收到信息,没订阅就收不到信息。
在观察者模式中,改变主题或观察者任意一方,并不会影响到另一方,两者是松耦合的,只要两者的接口仍被遵守,就可以自由地改变他们。
JDK中有很多地方都实现了观察者模式,比如XXXView.addXXXListenter , 当然了 XXXView.setOnXXXListener不一定是观察者模式,因为观察者模式是一种一对多的关系,对于setXXXListener是1对1的关系,应该叫回调。
java中实现了观察者模式,借助于java.util.Observable和java.util.Observer.
主题类继承了 Observable类
package com.zhy.pattern.observer.java;
import java.util.Observable;
public class SubjectFor3d extends Observable
{
private String msg ;
public String getMsg()
{
return msg;
}
/**
* 主题更新消息
*
* @param msg
*/
public void setMsg(String msg)
{
this.msg = msg ;
setChanged();
notifyObservers();
}
}
使用者实现了Observer 的接口
package com.zhy.pattern.observer.java;
import java.util.Observable;
import java.util.Observer;
public class Observer1 implements Observer
{
public void registerSubject(Observable observable)
{
observable.addObserver(this);
}
@Override
public void update(Observable o, Object arg)
{
if (o instanceof SubjectFor3d)
{
SubjectFor3d subjectFor3d = (SubjectFor3d) o;
System.out.println("subjectFor3d's msg -- >" + subjectFor3d.getMsg());
}
if (o instanceof SubjectForSSQ)
{
SubjectForSSQ subjectForSSQ = (SubjectForSSQ) o;
System.out.println("subjectForSSQ's msg -- >" + subjectForSSQ.getMsg());
}
}
}
必要时我们可以实现自己的观察者模式来避免一些重复代码,或是设定通知观察者的方式等等