观察者模式

原创 2017年08月01日 19:28:20

定义

定了了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新

在具体实现中,开发者可以自己定义一整套观察者框架,也可以利用java提供的api实现这个模式

自定义实现观察者模式

观察者模式主要在解耦方面有巨大的作用,开发者可以自己实现整个观察者模式框架,一般会实现了观察者接口,这个接口的必需的一个方法是提供 主题(被观察者)状态发生变化时,需要调用的,像Observer接口中的receiverNews方法

public interface Observer {

    public void receiverNews(News news);

}

主题接口一般最少提供三个方法,一个观察者注册接口,一个移除接口,一个通知接口。
所有主题类必需实现该接口。具体的代码见我的github代码

依赖JDK实现观察者模式

利用java api
被观察者实现类需要extends Observable,观察者需要implements Observer接口

被观察者发布新状态需要先调用setChanged(),然后调用notifyObservers()。这里setChanged方法存在的意义是为了 规避当被观察者数据虽然更新了,但数据其实是没变的。例如一个天气系统,第一次被观察者更新温度数据21°,通知其订阅者,订阅者收到消息后作出相应的改变,第二次被观察者更新的温度数据还是21°,这时候就没必要在发送(当然这个根据你的业务,如果系统要求不变也得发送那你就可以忽视了)。
notifyObservers方法是通知所有订阅者的方法,可以将发送的数据放在这个方法里。

所有的观察者都要实现observer接口并且必需复写其update方法,

@Override
    public void update(Observable topic, Object content) {

        if(topic instanceof NewsOfficeJDK){
            System.out.println("alice received a news about "+ ((News)content).getTitle()+" from "+((NewsOfficeJDK)topic).getName());
        }else if(topic instanceof JavaOfficeJDK){
            System.out.println("alice received a news about "+ ((News)content).getTitle()+" from Java ");
        }

    }

第一个参数Observable是消息的发送者,第二个参数时消息内容。
感觉利用jdk实现观察者模式是很不方便的,并且被观察者必需继承Observable类,其实自己实现这个模式代价可以忽略不计,而且可以随意修改。

观察者模式提示是挺好理解的,就简答的讲述这么多。

我的示例代码
https://github.com/yangzhenkun/DesignPatternLearn/tree/master/src/main/java/com/yasin/DesignPatternLearn/ObserverPattern

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)