4

java.awt.event 包中适配器模式的使用让我感到困惑。一方面,这似乎明显违反了接口隔离原则 (ISP)。

与 MouseMotionAdapter 类实现 MouseMotionListener 类似,但为这两种重写方法提供“NIL”实现。

这正是 ISP 违规的全部内容?通过 ISP,MouseMotionListener 会被分成两个独立的接口,一个用于 moseDragged 和 moveMoved 行为?

也许以这种方式拆分接口会增加接口的数量,并且还会使编码更加不优雅,因为每个实现类都需要实现大量接口。

如果我的论点是合理的,只需要澄清一下吗?

4

1 回答 1

0

违反 ISP。

简短版本:您只考虑编写处理代码的系统部分。您没有考虑事件是在哪里生成的(都在同一个地方,鼠标监控代码),也没有考虑注册这些事件的代码。

长版:想想MouseEvents 可能是如何生成的。Java 有一个类可以监视鼠标活动,最终在本机级别,并相应地生成事件。所有的MouseListeners 都在一个侦听器多播链中。如果你想监听多种鼠标事件,你必须为你的监听器做一个单独的注册调用来监听每种鼠标事件。您必须成为各种多播器链的一部分。然后,生成这些MouseEvents 的所有类都必须确保将事件中继到正确的侦听器事件类型,这意味着您必须Queue为每种类型的事件创建一个新事件 - 除非您想要拥有大instanceof链。

或者,或者,您可以将它们统一到一个MouseListener界面中,当发生您不关心的事件时,让您的类什么都不做。如果你不能扩展MouseAdapter类,这会增加一点额外的代码,或者如果可以的话,什么都不会。系统其余部分的收益超过了这几个额外的{ }方法。

于 2014-04-01T14:04:20.007 回答