关闭

观察者模式

标签: 设计模式java
288人阅读 评论(0) 收藏 举报
分类:

定义

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

在具体实现中,开发者可以自己定义一整套观察者框架,也可以利用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

0
0
查看评论

浅谈为什么设计模式要有观察者模式--观察者模式的意义

设计模式可以说是一种代码规范,也可以说是一种前人总结的奇技淫巧,对于后来编程者,学习设计模式可以对编程思路有一些启发,其中也包括经验启发. php相对java形式比较随意,所以对于模式设计更需要多花时间研究.下面通俗地说说观察者模式使用场景和意义: 先不提定义,我们先思考一个实例,当博客更新文章时,...
  • h330531987
  • h330531987
  • 2017-09-03 14:23
  • 377

一个用观察者模式解决实际问题的例子

前几天组里接到一个以前开发的已上线项目的维护任务,要求把其中的一些数据定时通过webservice接口上传到当地某市某平台上面,基本上算是个体力活儿了。 时间仓促只好加班加点,搜集比对 -->拼写SQL-->调试接口-->测试上传。。。 正要把十几个接口搞定的时候,突然接到新要...
  • u012763117
  • u012763117
  • 2014-03-09 02:31
  • 1482

观察者模式(看完马士兵视频的总结)

例子就是一个小孩在睡觉,当小孩醒过来之后,爸爸要喂奶,爷爷要
  • oWuGuanFengYue123
  • oWuGuanFengYue123
  • 2014-05-06 11:45
  • 1613

JavaScript设计模式--观察者模式

一、定义观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式。 好处: (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间...
  • ligang2585116
  • ligang2585116
  • 2015-12-20 19:22
  • 5075

Unity设计模式:观察者模式

初学编程的时候内容比较少没有数据交互,等内容多到需要多个文件多个类协同运行的时候就涉及到类之间的数据交互了。比较简单的数据交互是这些类之间互相引用,直接或间接传值或调用,但是这样类之间的耦合性太高了,如果项目复杂且经常变动,类之间的引用关系可能会让开发人员陷入一团乱麻无法下手。尤其是有些不同模块不同...
  • ylbs110
  • ylbs110
  • 2016-12-31 08:36
  • 530

观察者模式(这个用的太多了)

一.观察者模式的定义 定义对象间一种一对多的依赖关系,是的没当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 二.观察者模式的使用场景 (1).关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系 (2).事件多级触发场景 (3).跨系统的消息交换场景,如消息...
  • u011889786
  • u011889786
  • 2016-04-04 10:21
  • 883

线程安全的观察者模式的设计

观察者模式的应用,主要的行为就是注册和移除观察者(observer),以及通知所有已注册的Observers。这里介绍的是Chromium项目中实现的线程安全的观察者管理及通知的基础类ObserverListThreadSafe。
  • HorkyChen
  • HorkyChen
  • 2015-08-05 01:12
  • 2912

JAVA中观察者模式示例

观察者模式是关于多个对象想知道一个对象中数据变化情况的一种成熟模式。观察者模式中有一个称作“主题”的对象和若干个称作“观察者”的对象,“主题”和“观察者”之间是一种一对多的依赖关系 。当“主题”的状态发生变化时,所有“观察者”都得到通知。 观察者模式的优点: 具体主题和具体...
  • qq7342272
  • qq7342272
  • 2011-10-26 15:36
  • 6915

原生JavaScript实现观察者模式

什么是观察者模式维基百科对观察者模式的定义如下: 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 说的简单些,就是在数据发生改变时,对应的...
  • lm278858445
  • lm278858445
  • 2017-10-19 17:37
  • 434

观察者模式的优缺点以及使用场景(三)

观察者模式的效果有以下的优点:第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。观察者模式有下面的缺点:第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 观察者模式的效果有以下的优点: 第一、观察者模式在被观察者和观察者之间建立...
  • MNJLJ_23NMK
  • MNJLJ_23NMK
  • 2016-04-21 12:08
  • 4261
    个人资料
    • 访问:74867次
    • 积分:1324
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:1篇
    • 译文:0篇
    • 评论:31条