我应该在Observer Events中传递信息吗?

时间:2014-09-01 07:23:38

标签: java design-patterns observer-pattern

我有一个活动Login。我打算用以下信息填充该事件:

// Class A.
Login login = new Login();
login.setUsername(userName);
observer.notifyEvent(login);

我们的想法是让班级B获取此信息。

这是不好的做法吗?如果是这样的话?

唯一可以解决的问题是该软件的其他部分将无缘无故地听取这个问题。实际上只有一个班级应该获得信息。

唯一的好处是我的所有类都连接到Observer对象,但没有相互连接。换句话说,如果我想传递用户名,我需要连接AB。我只会在极端情况下这样做。

3 个答案:

答案 0 :(得分:1)

没有太大问题。 - 但是,您可能希望在事件对象中包含事件的“发送者”,以便侦听器可以识别它来自何处,并且如果需要,可以从事件源获取更多状态信息。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

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

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

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

参考您的示例,最好引入Login主题,而不是订阅任何对此特定主题不感兴趣的组件。