美文网首页
观测者模式

观测者模式

作者: caym | 来源:发表于2017-03-13 17:33 被阅读11次

组成部分:

观测者:Observer,也称它为订阅者,即Subscriber
被观测者:Observable,即可以被观察的东西,有时候会称之为主题,即Subject

情景:
天气预报订阅
如果天气发生变化,通知订阅者,订阅事物与订阅者可能是单对单也可能是一对多 多对多的关系。
创建天气model:

public class Weather {
    private String description;

    public String getDescription() {
        return description;
    }

    public Weather(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Weather{" +
                "description='" + description + '\'' + '}';
    }
}

创建被观测者,即observable:
其应该至少提供:订阅、退订、状态发生变化通知观测者的方法

public class Observable<T> {
    /**
     * 订阅者们
     */
    ArrayList<Observer<T>> observers = new ArrayList<>();
    /**
     * 订阅
     * @param observer
     */
    public void register(Observer<T> observer){
        if (observer==null) return;
        synchronized (this){
            if (observers.contains(observer))return;
            observers.add(observer);
        }
    }

    /**
     * 退订
     * @param observer
     */
    public void unregister(Observer<T> observer){
        observers.remove(observer);
    }

    /**
     * 通知各个订阅者
     */
    public void notifyObserver(T data){
        for (Observer<T> observer :observers){
            observer.onUpdate(data);
        }
    }
}

创建观测者接口,观测者只需接收状态变化:

public interface Observer<T> {

    void onUpdate(T data);
}

test:

public class Test {

    public static void main(String[] s){
        Observable<Weather> observable = new Observable<>();
        Observer<Weather> xiaoming = new Observer<Weather>() {
            @Override
            public void onUpdate(Weather data) {
                System.out.println("小明接收到的订阅:"+data.getDescription());
            }
        };
        Observer<Weather> xiaohong = new Observer<Weather>() {
            @Override
            public void onUpdate(Weather data) {
                System.out.println("小红接收到的订阅:"+data.getDescription());
            }
        };
        observable.register(xiaoming);
        observable.register(xiaohong);

        Weather weather = new Weather("多云");
        observable.notifyObserver(weather);
        weather = new Weather("阴天");
        observable.notifyObserver(weather);
        weather = new Weather("晴天");
        observable.notifyObserver(weather);
    }
}

相关文章

  • 观测者模式

    组成部分: 情景:天气预报订阅如果天气发生变化,通知订阅者,订阅事物与订阅者可能是单对单也可能是一对多 多对多的关...

  • 探空资料对比

    最后选用METpy画模式和观测的对比(METpy可以兼顾两者画图)观测的还是选用Wyoming upper air...

  • JS设计模式之观测者模式

    如果, 你只能学习一种设计模式,那么这种模式就只能是观察者模式。观察者模式的应用范围很广, 可能你在无意中就遇到过...

  • 观测者

    刚走到饭店门口时,我便听见了有人招呼的声响,扭头便看见了角落里的北村,他舔着嘴唇,摆着双手待我走近。 枯燥的寒暄异...

  • 观测者

    向我展示你真实的样貌 隐而不露的万物至理 真的存在吗? 是大脑的异想天开 抑或是 一个精心编织的谎言 一场荒诞不经...

  • 观测者

    我静默地走在归去的路上,两手都插在衣兜,步子不很急,也不显得缓慢。戴着新拿到的耳机,音乐声调得比平日大了一些,一步...

  • 相信自己!一篇哲学日记

    有“自我”,才有世界。而自我,是这世界的最佳观测者,它也被称为“观测者意识”。没有观测者意识观测并改变的世界,并不...

  • 完全观测者

    文/译世 我很害怕影子。 我指的不是小孩子那种因为害怕黑暗而顺带产生的影子恐惧症,也不是类似于小丑恐惧症之类的由于...

  • SAP 电商云 Spartacus UI 客户端模式下产品主数据

    在客户端渲染即 CSR 模式下,我们能在 Chrome 开发者工具里观测到大量根据 product code 读取...

  • Ashley Madison | 走过留下痕迹

    物理学中有一个观测者效应(observer effect),意思是观测者的行为本身会对观测对象产生影响。量子力学层...

网友评论

      本文标题:观测者模式

      本文链接:https://www.haomeiwen.com/subject/zjhqnttx.html