为啥 MouseAdapter 是适配器?

Posted

技术标签:

【中文标题】为啥 MouseAdapter 是适配器?【英文标题】: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,他们是“设计模式:可重用的面向对象软件的元素”的作者 【参考方案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 适配器说您有一些无法更改的遗留类(工具包),因此您可以根据应用程序的需要调整其接口。

以上是关于为啥 MouseAdapter 是适配器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥处理点击的功能需要从适配器初始化传递?

为啥我不能通过 BizTalk SMTP 适配器更改正文部分的附件名称?

网络适配器设备被停用,错误代码22,这是为啥?我该怎么办?

为啥工作灯适配器不起作用?

为啥 Rest Controller 会给出错误:“处理程序没有适配器”?

为啥我的适配器更新不起作用