基于Java观察者模式的定义
定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。
看一张图:
编码实现
首先开始写我们的主题接口,和观察者接口:
package observer;
//主题接口
public interface Subject {
/**
* 注册一个观察者
* @param observer
*/
public void registerObserver(Observer observer);
/**
* 删除一个观察者
* @param observer
*/
public void removeObserver(Observer observer);
/**
* 通知所有观察者
*/
public void notifyObserver();
}
观察者接口:
package observer;
/**
* 所有观察者都需要实现此接口
*/
public interface Observer {
public void update(String msg);
}
然后我们以微信公众号发布订阅消息为例:
package observer;
import java.util.ArrayList;
import java.util.List;
public class WXPublic implements Subject{
private List<Observer> observers = new ArrayList<Observer>();
/**
* 微信公众号的发布信息
*/
private String msg;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int index = observers.indexOf(observer);
if(index>=0)observers.remove(index);
}
/**
* 通知所有观察者
*/
@Override
public void notifyObserver() {
observers.forEach(observer->{
observer.update(msg);
});
}
public void setMsg(String msg){
this.msg = msg;
notifyObserver();
}
}
最后建俩个观察者,为了方便我写到了一个类里面:
package observer;
public class Observer1 implements Observer {
private Subject subject;
Observer1(Subject subject){
this.subject = subject;
subject.registerObserver(this);
}
@Override
public void update(String msg) {
System.out.println(this.getClass().getName()+"得到可靠消息:"+msg);
}
public static void main(String[] args) {
WXPublic wxPublic = new WXPublic();
//关注者
Observer1 observer1 = new Observer1(wxPublic);
Observer2 observer2 = new Observer2(wxPublic);
wxPublic.setMsg("first");
wxPublic.setMsg("second");
}
}
class Observer2 implements Observer {
private Subject subject;
Observer2(Subject subject){
this.subject = subject;
subject.registerObserver(this);
}
@Override
public void update(String msg) {
System.out.println(this.getClass().getName()+"得到可靠消息:"+msg);
}
}
最后输出结果:
observer.Observer1得到可靠消息:first
observer.Observer2得到可靠消息:first
observer.Observer1得到可靠消息:second
observer.Observer2得到可靠消息:second