Java 我应该在观察者事件中传递信息吗

Java 我应该在观察者事件中传递信息吗,java,design-patterns,observer-pattern,Java,Design Patterns,Observer Pattern,我有一个事件登录。我计划用以下信息填充该事件: // Class A. Login login = new Login(); login.setUsername(userName); observer.notifyEvent(login); 我们的想法是让classB获得这些信息 这是坏习惯吗?如果是,为什么 唯一可以预见的问题是,软件的其他部分会无缘无故地监听此消息。实际上,只有一个类应该获得信息 唯一的优点是,我的所有类都连接到Observer对象,但不相互连接。换句话说,如果我想传递用户

我有一个事件
登录
。我计划用以下信息填充该事件:

// Class A.
Login login = new Login();
login.setUsername(userName);
observer.notifyEvent(login);
我们的想法是让class
B
获得这些信息

这是坏习惯吗?如果是,为什么

唯一可以预见的问题是,软件的其他部分会无缘无故地监听此消息。实际上,只有一个类应该获得信息


唯一的优点是,我的所有类都连接到Observer对象,但不相互连接。换句话说,如果我想传递用户名,我需要连接
A
B
。只有在极端情况下我才会这么做。

没什么问题。-但是,您可能希望在事件对象中包含事件的“发送者”,以便侦听器可以识别事件的来源,如果需要,还可以从事件源获取进一步的状态信息。

允许您将事件源与事件的使用者分离

这通常是一个好主意,即使您只打算注册一个消费者

但是,我建议您不要使用
java.util.Observer
,它将普通
java.lang.Object
用作事件,这意味着您必须通过
instanceof
检查事件对象,并将其转换为适当的类


我认为最好使用支持泛型类型的
Observer
Listener
实现,例如Spring或Guava,它允许您为特定类类型的事件注册侦听器,例如示例中的
Login.class

好吧,你可能需要更深入地了解一下GoF的原著。对于这种情况,当开发人员关心可能对不同类型事件感兴趣的不同组件时,本书提供了由
ChangeManager
维护的
subjects
集合

因此,当组件对特定类型的事件感兴趣时,它会将特定主题传递给
Register
方法,这样该组件就不会收到代表不同主题的事件的更新。另一个优点是进一步减少耦合

或者,您可能最终构建一个系统,其中任何连接到线路的组件都会侦听所有事件,但该解决方案过于通用,给实现增加了很多风险(例如,在具有自动内存管理功能(如.NET)的运行时中,垃圾收集器在侦听任何事件时不会收集订阅服务器,这只是因为ChangeManager仍然维护对它的引用)。它为订阅者增加了一个额外的责任-它必须对事件进行额外的筛选,分析其类型

经验法则是,如果您不想在事件发生时收到通知,则无需订阅特定的事件

参考您的示例,最好引入
登录
主题,而不要订阅对该特定主题不感兴趣的任何组件