为啥 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 适配器更改正文部分的附件名称?