你应该更新的Java知识之Observer

标签: 更新 java 知识 | 发表时间:2016-07-30 21:12 | 作者:aoyouzi
出处:http://www.iteye.com

作为一个Java程序员,不熟悉设计模式简直不好意思和人打招呼,而Observer模式可以说是位列最常用的设计模式之列,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模式就是这个模式。

 

手工实现一个Observer也不是多复杂的一件事,只是因为这个设计模式实在太常用了,Java就把它放到了JDK里面:Observable和Observer,从JDK 1.0里,它们就一直在那里。从某种程度上说,它简化了Observer模式的开发,至少我们不用再手工维护自己的Observer列表了。

 

不过,如前所述,JDK里的Observer从1.0就在那里了,直到Java 7,它都没有什么改变,就连通知的参数还是Object类型。要知道,Java 5就已经泛型了。Java 5是一次大规模的语法调整,许多程序库从那开始重新设计了API,使其更简洁易用。当然,那些不做应对的程序库,多半也就过时了。这也就是这里要讨论知识更新的原因所在。

 

今天,对于普通的应用,如果要使用Observer模式该如何做呢?答案是Guava的EventBus。如你所见,它的名字并没有直接告诉你它是一个Observer,但这有什么关系呢,Listener不也是这样。

 

首先,我们声明一个Observer:

 

public class EventObserver {

@Subscribe public void onMessage(Message message) {

...

}

}

 

你会发现,这个类并没有继承任何接口,只是在用来响应通知的方法上声明了一个@Subscribe。

 

使用EventBus很简单,先声明一个

 

EventBus eventBus = new EventBus();

 

然后,把我们写好的Observer注册进去:

 

eventBus.register(new EventObserver());

 

当要通知Observer时,我们只要这样即可:

 

eventBus.post(message);

 

这里,我们并没有告诉EventBus,我们要处理的是一个Message类型,只是在EventObserver的onMessage方法的接口声明上使用了这个类型而已。但是,当我们把消息发送出去的时候,它会根据类型进行匹配,保证我们的消息正确地发送到对应的地方。

 

相比于JDK原有的实现,这个实现会更简单。EventObserver不再需要存在一个继承体系中,而继承总是一种枷锁,把我们套牢在一个体系之中:

 

我们不必遵循一个特定的名字,比如Observer的update,而这里的名字onMessage是我们自己起的。 

我们不必遵循特定的类型,比如update方法中作为被观察对象Observable和作为参数的Object,而是根据我们自己的需求选择的类型。 

这种变换让静态类型的Java语言,有了一些动态类型的特质,也让程序更加灵活。这种灵活性多半要归功于Annotation,它在很大程度上影响了Java的程序设计风格。

 

除了标准的EventBus,Guava还提供了另外一个AsyncEventBus,从名字就可以看出,这是一个异步的EventBus,也就是说,消息扔给它之后,会立即返回,至于Observer什么时候处理,那就是它的事情了。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [更新 java 知识] 推荐:

你应该更新的Java知识之常用程序库(二)

- - 梦想风暴
一句话,如果你写单元测试,就应该用 Hamcrest. 如今不写单元测试,你都不好意思说自己在做工程项目了. 如果你还写成下面这样,我只能说你落伍了:. 请告诉我,哪个是执行结果,哪个是预期结果,不管你是怎样,反正大多数情况下,我是记不住的. 所以,这个在只重功能不重可读性年代产生的API该更新了.

你应该更新的Java知识之常用程序库(一)

- - 梦想风暴
在很多人眼中,Java已经是一门垂垂老矣的语言,但并不妨碍Java世界依然在前进. 如果你曾离开Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老Java中的新东西. 一句话,只要你做Java项目,就应该用 Guava. guava是Google出品的一套Java核心库,在我看来,它甚至应该是JDK的一部分.

你应该更新的Java知识之构建工具

- - 梦想风暴
时至今日,如果你的Java项目依然需要启动一个特定的工具,比如IDE,才能编译部署,那你的项目不在本文的讨论之中,因为实在落后得太让人无语了. 旧时代的Java世界,构建工具等同于两个词 Ant和 Maven. Ant源自Make,同JUnit一样,它也是一个航班产物(参见《 Ant权威指南》序).

你应该更新的Java知识之Observer

- - Java - 编程语言 - ITeye博客
作为一个Java程序员,不熟悉设计模式简直不好意思和人打招呼,而Observer模式可以说是位列最常用的设计模式之列,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模式就是这个模式. 手工实现一个Observer也不是多复杂的一件事,只是因为这个设计模式实在太常用了,Java就把它放到了JDK里面:Observable和Observer,从JDK 1.0里,它们就一直在那里.

java基础知识

- - CSDN博客互联网推荐文章
JAVA相关基础知识. 1、面向对象的特征有哪些方面. 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. 抽象包括两个方面,一是过程抽象,二是数据抽象. 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.

硅谷中的知识产权:Java大战

- - 译言-投资/理财/创业
硅谷的知识产权:Java大战  甲骨文和谷歌之间的法律斗争非常神秘,但是风险也非常高. 甲骨文和谷歌的老总分别是拉里·埃里森和拉里·佩奇. 他们的教名是一样的,但对某一知识产权问题的观点却是不同的. 4月16日,陪审团开始在庭审中听取双方的辩解,来决定谷歌的安卓操作系统是否侵犯了甲骨文公司的版权和专利.

欧朋浏览器6.2 For Android/Symbian/Java发布更新

- 洞箫 - cnBeta.COM
新一代浏览器界面,简约、精致、时尚,摆脱拥挤,复杂的手机浏览器界面,打造个性化的浏览器. 快速拨号“快速拨号”将喜欢的网站添加到首页,实现一键点击访问. 通过定制“快速拨号”,你可以打造一个个性化的浏览器首页. 体积小巧、功能强大,欧朋浏览器结合了强大的内核和领先的云端转码技术,可使手机访问网站速度提升5到10倍,使上网流量节省最高达90%.

苹果发布第二个 Java 更新(2012-002)

- - 果迷网
前天苹果刚刚发布 Mac OS X 的 Java 更新 2012-001,今天又接着发布了 Java 2012-002 更新,再度提高系统安全性. 根据统计,目前全球共有 60 万台 Mac 电脑感染了 Flashback 木马,这种木马正是利用了 Java 运行时的安全缺陷感染 Mac 电脑的.

深入理解Java虚拟机(JVM高级特性与最佳实践java虚拟机)的一些知识总结

- - CSDN博客推荐文章
        要回答这个问题,先了解下GC的发展史、jvm运行时数据区的划分、jvm内存分配策略、jvm垃圾收集算法等知识.         先说下jvm运行时数据的划分,粗暴的分可以分为堆区(Heap)和栈区(Stack),但jvm的分法实际上比这复杂得多,大概分为下面几块:.         1、程序计数器(Program Conuter Register).

Oracle Java SE 8 发行版更新:限制商业或生产用途

- - 开源中国社区最新新闻
Oracle Java SE 8 发行版更新. Oracle Java SE 8 的公开更新仍面向单独的个人使用提供,至少持续至 2020 年底. 2019 年 1 月以后发布的 Oracle Java SE 8 公开更新将不向没有商用许可证的业务、商用或生产用途提供. 如果您是使用者,将 Java 用于单独的个人用途,则至少在 2020 年底之前,您对 Oracle Java SE 8 更新仍具有与现在相同的访问权限.