在java.awt.event包中混淆使用适配器模式并违反接口隔离原则(ISP)

时间:2013-12-13 10:19:41

标签: java interface-segregation-principle

在java.awt.event包中使用Adapter patttern看起来让我感到困惑。第一方面,它似乎明显违反了接口隔离原则(ISP)。

类似于MouseMotionAdapter类实现了MouseMotionListener,但为重写的方法提供了“NIL”实现。

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

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

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

1 个答案:

答案 0 :(得分:0)

违反了ISP。

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

长版本:想一想如何生成MouseEvent。 Java有一个监视鼠标活动的类,最终在本机级别,并相应地生成事件。所有MouseListener都在listener multicaster chain中。如果您想要收听多种鼠标事件,则必须为每种鼠标事件的监听器执行单独的注册调用。您必须成为各种多链路链的一部分。然后,生成这些MouseEvent的所有类必须确保事件被转发到正确的侦听器事件类型,这意味着您必须为每种类型的事件都有一个新事件Queue - 除非你想拥有大的instanceof链。

或者,或者,您可以将它们统一到一个MouseListener界面中,让您的课程在您不关心的事件发生时不做任何事情。如果你不能扩展MouseAdapter类,那么这会增加一些额外的代码,如果可以的话,根本不添加任何内容。系统其余部分的收益超过了那些额外的{ }方法。