domingo, 31 de octubre de 2010

Patrón de diseño: Adaptador

Saludos a todos.

Ahora hablaremos sobre otro patrón de diseño que puede ser utilizado en Java, que de hecho, hasta en su propia API se ha incluido para el manejo de eventos de interfaces gráficas. Estoy hablando acerca del patrón de diseño: Adaptador.

Si, como su nombre lo indica, trata de adaptar una clase para que no implemente todos los métodos declarados en una interfaz, esto lo hace, usando una clase que ya la interfaz en cuestión y la clase que utiliza la adaptadora debe sólo implementar en método que necesite o requiera, vamos a ver si con ejemplos me entienden mejor:

En java.awt.event se encuentra la interfaz MouseListener, esta interfaz contiene los métodos que sirven para manejar eventos del ratón:
void mouseClicked(MouseEvent e)
void mouseEntered(MouseEvent e)
void mouseExited(MouseEvent e)
void mousePressed(MouseEvent e)
void mouseReleased(MouseEvent e)

Supongamos que nosotros queremos que nuestra clase sólo implemente el evento mouseClicked, si implementamos esta interfaz en nuestra aplicación debemos también implementar los métodos declarados y por lo tanto colocar los demás métodos (mouseEntered, mouseExited, mousePressed y mouseReleased) y dejarlos vacíos (por regla de java en cuanto a que implemento la interfaz).

Con la clase adaptadora eso sería más fácil, yo puedo hacer extender (heredar) mi clase a MouseAdapter. Este clase MouseAdapter, implementa a la interfaz MouseListener y contiene implementado todos los métodos del Listener (aunque vacío, no importa), por lo tanto al heredar sólo sobreescribo el método que necesito. La limitante es que como Java no soporta herencia múltiple, si mi clase ya extiende de otra clase no puedo utilizar la clase adaptadora y me veré obligado a utilizar el Listener requerido.

Veamos código:
Implementando la interfaz me obliga a implementar todos métodos, aunque no los utilice:


package patronesdisenio.adaptador;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MiClaseImplementada
implements MouseListener {
//La interfaz me obliga a implementar
//todos los métodos
@Override
public void mouseClicked(MouseEvent arg0) {}
@Override
public void mouseEntered(MouseEvent arg0) {}
@Override
public void mouseExited(MouseEvent arg0) {}
@Override
public void mousePressed(MouseEvent arg0) {}
@Override
public void mouseReleased(MouseEvent arg0) {}
}


La clase adaptadora me permite implementar sólo el método que deseo, aunque si mi clase ya extiende de otra clase, no podría utilizarla:



package patronesdisenio.adaptador;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JOptionPane;

public class MiClaseAdapter extends MouseAdapter {

@Override
public void mouseClicked(MouseEvent e){
JOptionPane.showMessageDialog(
null, "Hizo click en un elemento");
}
}


Esto es un ejemplo dentro del API de java, pero igualmente podría adaptarse a nuestro sistema, en caso de que no necesitemos implementar todos los métodos de una interfaz.

7 comentarios:

Anónimo dijo...

Parece mentira lo fáciles que son las cosas cuando alguien sabe explicarlo. ¡Muchísimas gracias!

Kelvin dijo...

Gracias amigo por tu comentario.

Joguer tacas dijo...

Muchas gracias por tu explicación.

Anónimo dijo...

gracias, añado este por si alguien quiere ver algo más completo:

http://software.guisho.com/patron-adaptador-pattern-adapter-patrones-de-diseno

Kelvin dijo...

Gracias, toda información adicional que complemente, extienda, especifique o detalle será bienvenido. Gracias por tu aporte.

Anónimo dijo...

y pensar que mi profesor no pudo hacerme entender en un semestre lo que tu en diez minutos. Gracias.

Unknown dijo...

Gracias, muy sencillo de comprender