在java.awt.event包中使用Adapter patttern看起来让我感到困惑。第一方面,它似乎明显违反了接口隔离原则(ISP)。
类似于MouseMotionAdapter类实现了MouseMotionListener,但为重写的方法提供了“NIL”实现。
这正是ISP违规的全部内容?通过ISP,MouseMotionListener将分为两个独立的接口,分别用于moseDragged和moveMoved行为?
也许以这种方式拆分接口会使接口数量变得不稳定,并且会使编码更加不优雅,因为每个实现类都需要实现大量接口。
如果我的论据合理,只需要澄清一下吗?
答案 0 :(得分:0)
违反了ISP。
简短版本:您只考虑编写处理代码的系统部分。您没有考虑事件的生成位置(全部在同一个地方,鼠标监控代码),也没有考虑注册这些事件的代码。
长版本:想一想如何生成MouseEvent
。 Java有一个监视鼠标活动的类,最终在本机级别,并相应地生成事件。所有MouseListener
都在listener multicaster chain中。如果您想要收听多种鼠标事件,则必须为每种鼠标事件的监听器执行单独的注册调用。您必须成为各种多链路链的一部分。然后,生成这些MouseEvent
的所有类必须确保事件被转发到正确的侦听器事件类型,这意味着您必须为每种类型的事件都有一个新事件Queue
- 除非你想拥有大的instanceof
链。
或者,或者,您可以将它们统一到一个MouseListener
界面中,让您的课程在您不关心的事件发生时不做任何事情。如果你不能扩展MouseAdapter
类,那么这会增加一些额外的代码,如果可以的话,根本不添加任何内容。系统其余部分的收益超过了那些额外的{ }
方法。