作为一个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什么时候处理,那就是它的事情了。

如果你想更多地了解EventBus,那Guava的官方文档是个不错的去处。

java 声明一个bus类_第11章 新特性 – 你应该更新的Java知识之Observer - Java 基础入门笔记...相关推荐

  1. java 声明一个bus类,EventBus3新特性及用法

    EventBus 3 简介 EventBus是一种为了优化Android组件之间事件传递的解耦工具,通过发布/订阅事件总线来实现事件在不同组件之间的事件传递. 在EventBus 3之前,greenr ...

  2. java 声明一个bus类_Java初级阶段测试附带答案

    Java初级阶段测试3 一.选择题(每题2分,共50分) 1.整型数据类型中,需要内存空间最少的是() A) short B) long C) int D) byte 2.Java语言中() A) 一 ...

  3. java设计一个user类_关于JAVA设计一个用户类

    关于JAVA设计一个用户类 关注:152  答案:2  mip版 解决时间 2021-02-02 05:51 提问者安分守己的小青春 2021-02-02 02:23 设计一个用户类,该类有用户编号. ...

  4. JAVA设计一个电视机类_漫谈Java程序设计中的接口应用

    Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in ...

  5. JAVA设计一个fan类_北京信息科技大学java语言程序设计-类和对象

    北京信息科技大学java语言程序设计-类和对象 [实验名称]实验2 类和对象 [实验目的] 1.学习和掌握Java创建对象的方法. 2.学习和掌握通过创建对象.使用类的方法. 3.学习和掌握Java类 ...

  6. Java课设对对碰_第11章对对碰游戏(图形版)(Java游戏编程原理与实践教程课件).ppt...

    游戏界面和相关图片素材 11.3 程序设计的步骤 11.3.1 设计游戏窗口类(GameRoom.java) 游戏窗口类GameRoom实现游戏全部功能,继承JFrame组件实现的.是由上方Panel ...

  7. JAVA定义一个多边形类_如何在每个数据类别中绘制多个多边形?

    一些代码在SIBRE的捆绑演示数据集上执行此操作 . 在这个例子中,我们尝试使用ggplot2创建后椭圆的多个样本的一些图 . library(SIBER) library(ggplot2) libr ...

  8. java订单类_基于Java创建一个订单类代码实例

    这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求描述 定义一个类,描述订单信息 订单id 订 ...

  9. java订单类_使用Java创建一个订单类代码实例

    这篇文章主要简介了使用Java创建一个订单类代码实例,文中通过示例代码简介的非常具体,对大家的学习或者工作具有一定的参考学习网上卖,需要的朋友可以学习下 需求描述 定义一个类,描述订单信息 订单id ...

最新文章

  1. 微信公众号接入图灵机器人实现自动回复消息
  2. python list_Python中的基本list操作
  3. Fleury (弗罗莱) 算法通俗解释
  4. Linux深入学习专业书
  5. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)
  6. Unparsed aapt error(s)! Check the console for output
  7. NGINX 502 Bad Gateway 用upstream解决方法
  8. MLCDForest:用深度森林对长链非编码RNA进行疾病预测的多标签分类模型
  9. STM32入门教程第一讲
  10. Chrome 开发者工具 network 显示 Provisional headers are shown 的几种原因
  11. 如何将瀚高数据库单机数据导入HGDW
  12. 机器学习入门项目——加州房价预测
  13. iconfont(图标字体)
  14. 文案馆头像壁纸小程序源码 带后台
  15. 融媒体时代背景下计算机应用,融媒体背景论文10篇_发表之家
  16. 58沈剑-数据库使用规范
  17. HTML图片和多行文字并列显示
  18. 最短路构造最短路95 C. Volleyball
  19. 大物复习整理(自用)
  20. 2022-09-08 mysql/stonedb-慢SQL-记录

热门文章

  1. 安全开发之w9scan扫描器源码学习
  2. 算法复杂度((平均,最好,最坏,均摊)时间复杂度,空间复杂度)
  3. 近代以来中华民族面临的两大历史任务及其相互关系是什么?
  4. 研究蛋白和DNA的相互作用—EMSA(凝胶迁移或电泳迁移率实验),可用于DAP-seq后续验证
  5. 浏览器上传大文件的解决方案
  6. 一、Python3运维自动化运维——psutil 模块详解(超级详细)
  7. winscp连接验证日志(具体情况参见会话日志): 使用用户名 root。验证失败
  8. PTA - 批量求和(*)
  9. 苹果电脑能装鸿蒙,纯小白必看!鸿蒙编译及烧录环境分开部署For Mac
  10. 中介公司的故事(一)-Java静态代理