Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这真的是适配器模式的一个示例吗?_Java_Design Patterns_Adapter - Fatal编程技术网

Java 这真的是适配器模式的一个示例吗?

Java 这真的是适配器模式的一个示例吗?,java,design-patterns,adapter,Java,Design Patterns,Adapter,我有一个接口--“EventHandler”--它声明了几个方法 public interface EventHandler { void handleEvent1(); void handleEvent2(); void handleEvent3(); void handleEvent4(); } 我还有一个类--“EventHandlerAdapter”--实现EventHandler。然而,它实际上并没有“实现”任何东西。关键是,如果另一个类想要实现

我有一个接口--“EventHandler”--它声明了几个方法

public interface EventHandler {
    void handleEvent1();

    void handleEvent2();

    void handleEvent3();

    void handleEvent4();
}
我还有一个类--“EventHandlerAdapter”--实现EventHandler。然而,它实际上并没有“实现”任何东西。关键是,如果另一个类想要实现EventHandler,但不是它的所有方法,它可以简单地扩展EventHandlerAdapter,只覆盖它想要的方法

public class EventHandlerAdapter implements EventHandler {
    public void handleEvent1() {}

    public void handleEvent2() {}

    public void handleEvent3() {}

    public void handleEvent4() {}
}

我不止一次见过这样的事情。“EventHandlerAdapter”这个名称向我暗示它是适配器模式的一个示例。。。但真的是这样吗?我认为适配器的意义在于将现有的实现转换为其他的实现。我不明白这里的情况如何


如果它不是适配器模式的示例,那么它是什么?当然类似的东西已经被识别。

你说得对,这不是适配器设计模式的示例,而是接口的一个微不足道的默认实现。我会将其重命名为
DefaultEventHandler
EmptyEventHandler
GenericEventHandler
,不,这不是适配器模式的示例,定义如下:

然而,在Java事件处理中,正如您所提到的,术语适配器经常被使用。尽管“适配器”一词在两者中是相同的,但它们指的不是同一事物。java.awt.event包中出现的适配器使创建只处理一个方法的事件处理程序变得容易,而不必编写一堆空方法。它们只是快捷方式类

Java事件API通常对这些类具有一致的命名。当有
SomeEvent
事件类时,有一个
SomeListener
接口来侦听事件,还有一个
SomeAdapter
类用空方法实现侦听器接口。并非所有事件都包含这三个部分,但这三个部分的命名和功能是一致的


在您提供的示例中,我将重命名类
EventAdapter
,以与现有Java API保持一致。

您是对的,这不是适配器模式的示例,而是一种被广泛采用的约定,即“适配器”的“默认值为空”


例如,java UI API通常为MouseListener接口提供这样的适配器。

AWT有许多接口实现,他们称之为“适配器”,如“MouseAdapter”、“FocusAdapter”。不,它们不是适配器模式的实现。它们是方便类,我只是简单地调用它们。

这与Java API不一致。我猜您也会以类似的方式命名Java类:)(+1)@Erick,我刚刚从关于这个命名约定的其他答案中了解到-很高兴知道:-)我仍然坚持认为,
DefaultEventHandler
等是一个比
eventhandleadapter
更好的名称,因为它没有歧义。不熟悉Java事件处理约定的人会对这个适配器感到困惑,而其他阵营的IMHO在理解默认*类名时不会有问题。即使命名约定模棱两可,还是坚持命名约定更好,还是修复命名约定更好?我更喜欢后者,但当然其他人可能有不同的偏好。@Erick,还要注意,Java API中有几个众所周知的错误设计/命名决策的例子,因此,它并不总是学习和坚持的最佳示例:-)如果要使用Java事件处理,人们应该精通Java事件处理。任何熟悉它的人都会立即识别适配器名称并知道它的功能。这就是坚持既定命名约定的好处。我一点也不觉得模棱两可。经过一番思考,我决定用“AbstractEventHandler”这样的词更合适。它可能不一致,但实际上,Java API本身是否一致?@someguy,名称Abstract*意味着类是
Abstract
,因此必须将其子类化才能使用。例如,Java收集框架包含几个这样的类。而在这种情况下,类是可用的,它可能是子类。因此,对我来说,这个名称可能会产生误导。@Péter Török类不应该在imo中直接使用。最初,我打算将构造函数声明为private,这样人们就不会将该类直接用作某种“nop”。查看java.awt.event API提醒我可以简单地将类声明为抽象类。。。愚蠢的我:P.@someguy,在这种情况下,命名确实没有问题。名称没有误导性,但它也没有必要,因为它与Java AWT事件API一致。我会不假思索地在我维护的代码中重命名它,但在其他人的代码中不使用它。