`

你应该更新的Java知识之Observer

阅读更多

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

分享到:
评论

相关推荐

    14-Observer.rar

    "Observer"通常指的是Java中的`java.util.Observer`接口或者类似其他编程语言中的接口或抽象类,它们是观察者模式的核心组成部分。下面我们将深入探讨观察者模式的相关知识点: 1. **模式定义**:观察者模式也被...

    java五子棋源代码

    Java五子棋源代码知识点总结 Java五子棋源代码是一个基于Java语言开发的五子棋游戏项目,提供了完整的游戏功能,包括游戏主界面、菜单栏、游戏逻辑等方面的实现。下面是对该项目中涉及的知识点的总结: 1. Java...

    Observer观察者模式

    Observer观察者模式是一种设计模式,属于行为模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式广泛应用于事件驱动编程和实时系统...

    HBaseObserver:通过HBase Observer同步数据到ElasticSearch

    5. **启动Observer**:在HBase集群上重启或者更新RegionServer,使得Observer开始运行。 这个过程涉及到的知识点包括: - HBase Observer机制的理解和应用 - Java编程,尤其是理解HBase和ElasticSearch的Java API -...

    设计模式之观察着模式Observer

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...通过理解这些知识点,你可以有效地在项目中运用观察者模式,实现灵活、可扩展的组件间通信。

    java编程实现时钟

    6. **设计模式**:在构建这样的应用程序时,可能会用到观察者模式(Observer Pattern),使时钟线程作为观察者,当时间改变时通知GUI组件更新显示。 总的来说,实现一个Java时钟程序涉及到了多方面的编程知识,包括...

    java软件测试工程师个人简历范文.pdf

    9. Java design pattern 知识:Java 设计模式是 Java 软件开发中的一个重要组件,Java 软件测试工程师需要具备 Java 设计模式的知识,包括 Singleton、Factory、Observer 等。 10. Agile Scrum 知识:Agile Scrum ...

    Java基础之聊天器

    【Java基础之聊天器】是关于使用Java编程语言构建一个简单聊天器的教程。这个项目旨在帮助初学者理解网络通信的基础知识,特别是TCP/IP协议在Java中的应用。在这个教程中,我们将探讨以下关键知识点: 1. **Java ...

    java与模式

    知识点: 1. Java设计模式的定义与重要性 设计模式是软件工程中一种被广泛认可和采纳的通用解决方案,用于解决特定上下文中的...希望读者能够对这些知识点有更深入的了解,并将之应用到日常的Java学习和开发工作中。

    乘客打车和司机抢单的Java实现.zip

    这可能涉及到Java的Observer设计模式或者发布/订阅模型。 5. **数据库操作**:为了存储乘客、司机、订单等信息,项目中可能使用了数据库。Java提供了JDBC(Java Database Connectivity)来连接和操作数据库,或者...

    java编写的绘图程序

    在Java中,你可以使用`ImageIcon`类加载图片,然后通过`drawImage(Image img, int x, int y, ImageObserver observer)`方法在画布上显示图片。 6. 整合与运行 在完成所有绘图和事件处理代码后,你需要将`DrawPanel...

    代码性能Java比较

    Java中的Observer接口就是对此模式的实现。 6. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。在Java中,适配器可以帮助不同接口的类协同工作。 7. **建造者模式**:将复杂对象的构建与其表示分离,...

    Java 笔试、面试 知识整理.zip

    Java作为一门广泛使用的编程语言,其笔试和面试的知识点涵盖了众多方面。对于想要在Java领域求职的开发者来说,深入理解并掌握这些知识点至关重要。以下是对Java笔试和面试中常见知识点的详细阐述: **1. Java基础...

    Java软件工程师企业测评测试题.pdf

    本资源涵盖了Java软件工程师企业测评测试题的所有知识点,包括Java基础知识、Java类和对象、Java方法和函数、Java数组和集合、Java异常处理、Java多线程编程、Java文件输入输出、Java网络编程和Java设计模式等。

    电梯模拟器 java 代码

    1. **Java基础知识**:首先,你需要熟悉Java的基本语法,包括类、对象、方法、变量等。在编写电梯模拟器时,你会创建表示电梯、楼层、乘客等对象的类。 2. **多线程**:电梯模拟器的核心在于多线程编程。每个电梯...

    《Head.First设计模式》书中源代码(Java语言)

    `Observer.java`和`Subject.java`文件可能包含观察者接口和主题类的定义。 4. **装饰器模式**:动态地给一个对象添加一些额外的职责,可以扩展功能而不影响其他对象。`Component.java`, `ConcreteComponent.java`, ...

    Java记事本程序 (Java程序设计入门实例,本人老师)

    Java记事本程序是初学者接触Java编程时经常会遇到的一个经典项目,它涵盖了众多的基础知识点,包括文件操作、流处理、GUI设计以及设计模式的应用。这个项目不仅有助于理解Java语言的核心特性,还能够锻炼实际问题的...

    Java面试题目总结(137页).docx

    本资源是 Java 面试题目的总结,涵盖了 Java 基础、多线程、设计模式、JVM、数据结构与算法、数据库、Spring、Netty、缓存、技术框架、技术深度、分布式、系统架构、LINUX、TCP/IP 等多方面的知识点。 Java 基础 ...

    Java实现仿雷电游戏源码

    通过研究并实践这个"Java实现仿雷电游戏源码"项目,你可以提升你的Java编程能力,了解游戏开发的基本流程,并且掌握一些高级技巧,如图形渲染、多线程管理和性能优化。这将对你未来从事游戏开发或其他类型的软件工程...

    使用java编写的钟表程序

    下面我们将深入探讨这个项目所涵盖的关键知识点: 1. **Java基础语法**:钟表程序的基础是Java语言的基本语法,包括类(Class)、对象(Object)、方法(Method)以及变量(Variable)。`Clock.java` 文件很可能...

Global site tag (gtag.js) - Google Analytics