作为一个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什么时候处理,那就是它的事情了。
相关推荐
"Observer"通常指的是Java中的`java.util.Observer`接口或者类似其他编程语言中的接口或抽象类,它们是观察者模式的核心组成部分。下面我们将深入探讨观察者模式的相关知识点: 1. **模式定义**:观察者模式也被...
Java五子棋源代码知识点总结 Java五子棋源代码是一个基于Java语言开发的五子棋游戏项目,提供了完整的游戏功能,包括游戏主界面、菜单栏、游戏逻辑等方面的实现。下面是对该项目中涉及的知识点的总结: 1. Java...
Observer观察者模式是一种设计模式,属于行为模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式广泛应用于事件驱动编程和实时系统...
5. **启动Observer**:在HBase集群上重启或者更新RegionServer,使得Observer开始运行。 这个过程涉及到的知识点包括: - HBase Observer机制的理解和应用 - Java编程,尤其是理解HBase和ElasticSearch的Java API -...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...通过理解这些知识点,你可以有效地在项目中运用观察者模式,实现灵活、可扩展的组件间通信。
6. **设计模式**:在构建这样的应用程序时,可能会用到观察者模式(Observer Pattern),使时钟线程作为观察者,当时间改变时通知GUI组件更新显示。 总的来说,实现一个Java时钟程序涉及到了多方面的编程知识,包括...
9. Java design pattern 知识:Java 设计模式是 Java 软件开发中的一个重要组件,Java 软件测试工程师需要具备 Java 设计模式的知识,包括 Singleton、Factory、Observer 等。 10. Agile Scrum 知识:Agile Scrum ...
【Java基础之聊天器】是关于使用Java编程语言构建一个简单聊天器的教程。这个项目旨在帮助初学者理解网络通信的基础知识,特别是TCP/IP协议在Java中的应用。在这个教程中,我们将探讨以下关键知识点: 1. **Java ...
知识点: 1. Java设计模式的定义与重要性 设计模式是软件工程中一种被广泛认可和采纳的通用解决方案,用于解决特定上下文中的...希望读者能够对这些知识点有更深入的了解,并将之应用到日常的Java学习和开发工作中。
这可能涉及到Java的Observer设计模式或者发布/订阅模型。 5. **数据库操作**:为了存储乘客、司机、订单等信息,项目中可能使用了数据库。Java提供了JDBC(Java Database Connectivity)来连接和操作数据库,或者...
在Java中,你可以使用`ImageIcon`类加载图片,然后通过`drawImage(Image img, int x, int y, ImageObserver observer)`方法在画布上显示图片。 6. 整合与运行 在完成所有绘图和事件处理代码后,你需要将`DrawPanel...
Java中的Observer接口就是对此模式的实现。 6. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。在Java中,适配器可以帮助不同接口的类协同工作。 7. **建造者模式**:将复杂对象的构建与其表示分离,...
Java作为一门广泛使用的编程语言,其笔试和面试的知识点涵盖了众多方面。对于想要在Java领域求职的开发者来说,深入理解并掌握这些知识点至关重要。以下是对Java笔试和面试中常见知识点的详细阐述: **1. Java基础...
本资源涵盖了Java软件工程师企业测评测试题的所有知识点,包括Java基础知识、Java类和对象、Java方法和函数、Java数组和集合、Java异常处理、Java多线程编程、Java文件输入输出、Java网络编程和Java设计模式等。
1. **Java基础知识**:首先,你需要熟悉Java的基本语法,包括类、对象、方法、变量等。在编写电梯模拟器时,你会创建表示电梯、楼层、乘客等对象的类。 2. **多线程**:电梯模拟器的核心在于多线程编程。每个电梯...
`Observer.java`和`Subject.java`文件可能包含观察者接口和主题类的定义。 4. **装饰器模式**:动态地给一个对象添加一些额外的职责,可以扩展功能而不影响其他对象。`Component.java`, `ConcreteComponent.java`, ...
Java记事本程序是初学者接触Java编程时经常会遇到的一个经典项目,它涵盖了众多的基础知识点,包括文件操作、流处理、GUI设计以及设计模式的应用。这个项目不仅有助于理解Java语言的核心特性,还能够锻炼实际问题的...
本资源是 Java 面试题目的总结,涵盖了 Java 基础、多线程、设计模式、JVM、数据结构与算法、数据库、Spring、Netty、缓存、技术框架、技术深度、分布式、系统架构、LINUX、TCP/IP 等多方面的知识点。 Java 基础 ...
通过研究并实践这个"Java实现仿雷电游戏源码"项目,你可以提升你的Java编程能力,了解游戏开发的基本流程,并且掌握一些高级技巧,如图形渲染、多线程管理和性能优化。这将对你未来从事游戏开发或其他类型的软件工程...
下面我们将深入探讨这个项目所涵盖的关键知识点: 1. **Java基础语法**:钟表程序的基础是Java语言的基本语法,包括类(Class)、对象(Object)、方法(Method)以及变量(Variable)。`Clock.java` 文件很可能...