为什么MouseAdapter是适配器?

时间:2012-02-11 21:22:06

标签: java design-patterns

名称(和javadocs)暗示MouseAdapter是适配器(设计模式)。但我并没有这样认为 - 至少在第一眼看来它并没有适应任何东西

唯一适应的是您可以将MouseAdapter的实例传递给任何需要其中任何一个接口的方法。因此,您可以使用仅MouseListener预期的MouseMotionListener实例。但是没有“翻译”发生。并且它不符合GoF的UML - 在“类适配器”版本中,预期对一个方法的调用会调用来自适配器的方法。

那么,这是一个适配器(设计模式),还是只是一个引起混淆的随机名称?

4 个答案:

答案 0 :(得分:13)

MouseAdapter首次出现在Feb 1997中发布的Java 1.1中。这意味着它是在1996年(或1995年?)的某个时候开发的。

UML(草案中)是completed by 1997

关于设计模式的第一本GoF书是published in 1995

所以,我不认为MouseAdapter中的 Adapter 与相应的设计模式有任何关系。或者,即使它确实如此,开发人员也没有统一的语言来表达设计模式,这使得很难理解真正的意义。

答案 1 :(得分:5)

是的,它不是GoF模式意义上的适配器,因为它不适应任何东西。 它可以被认为是抽象类模式[woolf97]:

的一个实例
  

超类可以提供默认的完整实现   或最小化的实施。

答案 2 :(得分:1)

正如其他答案所说,它不是GoF适配器模式。它的主要目的是通过在MouseListener(通常只是MouseMotionListener)中覆盖所需的方法来实现MouseAdapter(或mouseClicked())而不是创建所有其他方法的无意义的空实现。因此,它可以节省大量不必要的代码,尤其是在使用匿名事件侦听器时。例如(取自here

    someObject.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            ...//Event listener implementation goes here...
        }
    });

答案 3 :(得分:0)

我知道这个问题已经有了一个公认的答案,但是这里也提出了同样的问题:

MouseAdapter: which pattern does it use?

查看更多deatils,但MouseAdapter 将非常有用的MouseListener接口改编为更可用的形式。