观察者模式是对象与对象的一对多的依赖关系,数据源改变的时候,所有的监控对象得到通知并刷新。
通俗的理解模式中就两个东西,一个是观察者Observer,一个是被观察者Observerable。
在代码层面上理解呢,就四个东西,抽象被观察者接口Observerable和他的具体实现我们做个以天气预报为例的例子,那么这个具体实现就可以叫做WeatherServer,WeatherServer是被观察者的具体实现也是要改变的数据源,通俗的讲就是气象站。
//被观察者,相当于天气站的接口抽象
public interface Observerable {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
上述是抽象接口的简单表述,接下来看具体实现
public class WeatherServer implements Observerable {
private List<Observer> list;
private String msg;
public WeatherServer() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
list.remove(o);
}
@Override
public void notifyObserver() {
for(Observer o:list){
o.update(msg);
}
}
public void setInfomation(String s) {
this.msg = s;
System.out.println("天气更新消息: " + s);
//消息更新,通知所有观察者
notifyObserver();
}
}
另外两个是抽象观察者接口Observer,和具体的实现这个接口的观察者对象,这里举个例子,比如有两个人预定了天气预报服务,那么这个Observer的具体实现就是AidlUser和QranUser,这里我是举例子,名字可以随便起。这样的话需求就是天气预报有更新则会通知AidlUser和QranUser天气变化。
//相当于接收观察者抽象
public interface Observer {
public void update(String msg);
}
然后是具体用户的实现
public class AidlUser implements Observer {
@Override
public void update(String msg) {
System.out.print("亲爱的AidlUser,今天的天气是:"+msg);
}
}
最后来发布一下天气情况
public class Test {
public static void main(String[] args)
{
Observer aidl = new AidlUser();
Observer qran = new QranUser();
WeatherServer server = new WeatherServer();
server.registerObserver(aidl);
server.registerObserver(qran);
server.setInfomation("天气晴朗~");
}
}