【问题标题】:Why is MouseAdapter an adapter?为什么 MouseAdapter 是适配器?
【发布时间】:2012-03-03 21:22:31
【问题描述】:

名称(和 javadocs)暗示MouseAdapter 是一个适配器(设计模式)。但我不这么认为——至少乍一看,它不能适应任何东西

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

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

【问题讨论】:

  • 仅供参考,因为我不认识自己; GoF 指的是“四人帮”;即 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides,他们是“设计模式:可重用的面向对象软件的元素”的作者

标签: java design-patterns


【解决方案1】:

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

UML(在其草案中)是completed by 1997

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

所以,我认为MouseAdapter 中的Adapter 与相应的设计模式没有任何关系。或者,即使是这样,开发人员也没有统一的语言来表达设计模式,这使得理解真正的含义变得非常困难。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        MouseAdapter: which pattern does it use?

        查看那里了解更多细节,但 MouseAdapter 将非常尴尬的 MouseListener 接口改编变成了更可用的形式。

        【讨论】:

        • 这个推理的问题是,正如其他答案所表明的那样,在 MouseAdapter 情况下没有预先存在的适配器。 GoF 适配器的动机(我引用了 GoF 书)是“有时为重用而设计的工具包类不能重用,只是因为它的接口与应用程序所需的特定于域的接口不匹配。” MouseAdapter 是一个适配器,因为它可以很容易地适应(定制)以捕获鼠标事件。 GoF 适配器说您有一些无法更改的遗留类(工具包),因此您可以根据应用程序的需要调整其接口。
        猜你喜欢
        • 1970-01-01
        • 2011-04-21
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多