【问题标题】:MouseAdapter: which pattern does it use?MouseAdapter:它使用哪种模式?
【发布时间】:2011-11-28 21:33:06
【问题描述】:

我已经找到了很多资源,这些资源告诉我 Java API 中的 MouseAdapter 没有使用适配器模式。问题是:MouseAdapter 是否实现了某种模式?

我知道它的作用:它为 MouseListener 接口创建了一个具体类,因此您可以扩展该类以避免实现不必要的模式。

我在想它可能是桥接模式的一部分。不过我不确定,因为我不熟悉这种模式。

【问题讨论】:

  • “我找到了很好的资源,告诉我来自 Java API 的 MouseAdapter 没有使用适配器模式。”-- 你能提供资源吗?

标签: design-patterns


【解决方案1】:

好问题!

我可以理解为什么一位响应者说空对象,因为存在一些概念上的相似之处。我真的很喜欢这个答案。但在 Null Object 中,它确实是为了消除不断检查 null 的需要,如下所示:

if (obj != null)
    obj.DoSomething();

您可以通过创建一个使用无操作实现覆盖 DoSomething() 的存根对象来做到这一点。对我来说不同的是,意图肯定是不同的。如果我看到一个 Null 对象(无论是在名称中还是在 docos 中),我希望它应该使用无操作来实现所有操作。我永远不会期望它是一个从 Null 对象继承的类。事实上,在我看来,它们应该被密封。

我不认为 Adapter 有那么糟糕,因为 Adapter 的目的是将不兼容或确认的接口适应(更改)为可以使用或使用的格式。这绝对是 MouseAdapter 的意图。 MouseListener 接口确实是公认的,并且 MouseAdapter 正在将该接口转换为更容易使用的东西。

它将它改编成什么?我会说模板方法模式。特别是,它将接口实现方法转换为“钩子操作”。钩子操作是存在于子类中被覆盖的方法,通常实现为无操作,并由基类调用。 (从概念上讲,我猜它是 Null 方法而不是 Null 对象)。它们作为扩展点存在,这就是它们在这种情况下的使用方式。

【讨论】:

  • 没有降级,但这些答案说它不是适配器:stackoverflow.com/questions/9244185/…
  • 没关系,但我坚持我的回答,我想我已经详细说明了为什么我同意 Java 语言设计者首先将其命名为适配器 :)
  • 适配器一词可以有多种含义。我同意您所看到的适配器,但它与适配器的 GoF 含义不同。 GoF 适配器适应“为重用而设计的工具包类 [但] 不能重用,因为它的接口与应用程序所需的特定于域的接口不匹配。” (阅读 GoF 书籍了解更多详情)
【解决方案2】:

空对象模式应该符合要求。它基本上意味着一个对象具有其主体为空的方法。 MouseAdapter 和 WindowAdapter 都遵循这种模式,因为它们的方法中没有可执行代码。

Wikipedia: Null Object pattern

【讨论】:

    【解决方案3】:

    我不认为它使用了设计模式。如果您查看mouse adapter 的直接已知子类,最接近的可能是strategy design pattern,但这感觉不太对(对我而言)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      相关资源
      最近更新 更多