观察者模式

观察者模式是对象与对象的一对多的依赖关系,数据源改变的时候,所有的监控对象得到通知并刷新。

通俗的理解模式中就两个东西,一个是观察者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 list;

private  String msg;

public WeatherServer() {
    list = new ArrayList();
}

@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("天气晴朗~");


}

}

你可能感兴趣的:(观察者模式)