2012-02-11 14 views
12

El nombre (y javadocs) implica que MouseAdapter es un adaptador (el patrón de diseño). Pero no lo veo como tal, no se adapta nada a nada, a primera vista al menos¿Por qué MouseAdapter es un adaptador?

La única adaptación que ocurre es que se puede pasar una instancia de MouseAdapter a cualquier método que espere cualquiera de los dos interfaces. Por lo tanto, permite utilizar una instancia MouseListener donde solo se espera MouseMotionListener. Pero no hay una "traducción" sucediendo. Y no se ajusta al UML de GoF: en la versión de "adaptador de clase" se espera que una llamada a un método invoque un método del adaptado.

Entonces, ¿es eso un adaptador (patrón de diseño), o es solo un nombre aleatorio que causa confusión?

Respuesta

12

MouseAdapter apareció por primera vez en Java 1.1 lanzado en Feb 1997. Esto significa que fue desarrollado en algún momento en 1996 (o 1995?)

UML (en su versión preliminar) era completed by 1997.

El primer libro de GoF sobre patrones de diseño fue published in 1995.

Por lo tanto, no creo que Adaptador en MouseAdapter tenía algo que ver con el patrón de diseño correspondiente. O, incluso si lo hiciera, los desarrolladores simplemente no tenían un lenguaje unificado para expresar patrones de diseño que harían muy difícil comprender el significado real.

5

Sí, no es un adaptador en el sentido de patrón GoF porque no adapta nada. Se puede considerar como una instancia de Modelo abstracto Clase [woolf97]:

La superclase puede proporcionar una implementación completa que es una implementación predeterminada o mínima.

1

Como han dicho otras respuestas, no es un patrón de adaptador GoF. El objetivo principal es habilitar uno para implementar MouseListener (o MouseMotionListener) sobrescribiendo solo los métodos deseados en MouseAdapter (a menudo solo mouseClicked()) en lugar de tener que crear implementaciones vacías sin sentido de todos los otros métodos. Por lo tanto, ahorra una gran cantidad de códigos innecesarios, especialmente cuando se utilizan oyentes de eventos anónimos. Por ejemplo (tomado de here)

someObject.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      ...//Event listener implementation goes here... 
     } 
    }); 
0

Sé que ya hay una respuesta aceptada para esta pregunta, pero hicieron esta misma pregunta aquí:

MouseAdapter: which pattern does it use?

He allí para más deatils, pero MouseAdapter adapta la interfaz awakward MouseListener en una forma más utilizable.

+0

El problema con este razonamiento es que, como indican otras respuestas, no hay adaptaciones preexistentes en la situación de MouseAdapter. La Motivación del Adaptador GoF (estoy citando el libro GoF) es "A veces, una clase de kit de herramientas diseñada para su reutilización no es reutilizable solo porque su interfaz no coincide con la interfaz específica del dominio que requiere una aplicación". MouseAdapter es un * adaptador * porque se puede adaptar fácilmente (personalizar) para capturar eventos del mouse. GoF Adapter dice que tiene alguna * clase heredada * (kit de herramientas) que no puede cambiar, por lo que adapta su interfaz a las necesidades de su aplicación. – Fuhrmanator

Cuestiones relacionadas