2010-08-24 51 views
6

我有一个接口 - “EventHandler” - 它声明了几种方法。这是一个真正的适配器模式的例子吗?

public interface EventHandler { 
    void handleEvent1(); 

    void handleEvent2(); 

    void handleEvent3(); 

    void handleEvent4(); 
} 

我也有一类 - “EventHandlerAdapter” - 实现事件处理程序。但是,它实际上并没有“实施”任何东西。重点是,如果另一个类想要实现EventHandler,但不是所有的方法,它可以简单地扩展EventHandlerAdapter并且只覆盖它想要的方法。

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

    public void handleEvent2() {} 

    public void handleEvent3() {} 

    public void handleEvent4() {} 
} 

我见过这样的事情在不止一个场合。名称“EventHandlerAdapter”向我暗示它是适配器模式的一个例子......但是它是真的吗?我认为适配器的要点是将现有的实现转换为其他东西。我不明白这是怎么回事。

如果它不是适配器模式的例子,它是什么?当然,这样的事情已经确定。

回答

8

不,这不是一个适配器模式的一个例子,这里定义的:

http://en.wikipedia.org/wiki/Adapter_pattern

然而,在Java事件处理,术语适配器经常被用作你所提到的。即使“适配器”这个词在两​​者中都是相同的,但它们并没有提及相同的东西。出现在java.awt.event包中的适配器可以很容易地创建一个只处理一个方法而不必编写一堆空方法的事件处理程序。他们只是捷径班。

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

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

+0

是的,一致性是件好事;) – Bozho 2010-08-24 13:39:34

+0

经过一番思考,我决定像“AbstractEventHandler”这样的东西更合适。它可能不一致,但实际上,Java API本身是否一致? – someguy 2010-08-24 13:44:38

+1

@someguy,名称Abstract *暗示该类是'abstract',因此它必须被继承以便被使用。例如。 Java集合框架包含几个这样的类。在这种情况下,该类可以按原样使用,并且它可以被分类。所以对我来说这个名字会让人误解。 – 2010-08-24 13:52:05

2

你说得对,这不是适配器设计模式的例子,而是接口的一个简单的默认实现。我会将它重命名为DefaultEventHandlerEmptyEventHandlerGenericEventHandler

+0

这与Java API不一致。 – 2010-08-24 13:35:10

+0

我想你会以类似的方式命名Java类:)(+1) – Bozho 2010-08-24 13:36:46

+0

@Erick,我刚刚从关于这个命名约定的其他答案中学到了 - 很好的了解:-)尽管我仍然保留' DefaultEventHandler'等。是比“EventHandlerAdapter”更好的名称,因为它不含糊。不熟悉Java事件处理约定的人员对此适配器感到困惑,而恕我直言另一个阵营对理解Default *类名称没有问题。即使是不明确的,坚持命名约定还是更好?还是更好地解决它?我更喜欢后者,但当然其他人可能会有不同的偏好。 – 2010-08-24 13:41:09

2

你是对的,这不是适配器模式的一个例子,但广泛采用的惯例有“默认为空”称“适配器”

例如Java的UI的API通常会提供这样的适配器的MouseListener接口。

2

AWT有很多他们称之为“适配器”的接口的实现,比如'MouseAdapter','FocusAdapter'。不,它们不是适配器模式的实现。他们是便利班,我简单地称他们为stubs

相关问题