Adapter
(patrón de diseño)
Propósito
Convierte la interfaz de una clase en otra
interfaz que el cliente espera. Adapter permite a las clases trabajar juntas,
lo que de otra manera no podría hacerlo debido a sus interfaces incompatibles.
También conocido como
Wrapper (Envoltorio)
Aplicabilidad
Usar el patrón Adapter cuando:
Se desea usar una clase existente, y su interfaz
no se iguala con la necesitada.
Cuando se desea crear una clase reusable que
coopera con clases no relacionadas, es decir, las clases no tienen
necesariamente interfaces compatibles.
Estructura
Una clase adaptadora usa múltiples herencias para
adoptar una interfaz a otra.
Un objeto adaptador cuenta con la composición de
objetos.
Participantes
Target define la interfaz específica del dominio
que Client usa.
Client colabora con la conformación de objetos
para la interfaz Target.
Adaptee define una interfaz existente que necesita
adaptarse
Adapter adapta la interfaz de Adaptee a la
interfaz Target
Colaboraciones
Client llama a las operaciones sobre una instancia
Adapter. De hecho, el adaptador llama a las operaciones de Adaptee que llevan a
cabo el pedido.
Consecuencias
Los adaptadores de clase y objetos tienen
diferentes trade-off
Un
adaptador de clase:
Adapta Adaptee a Target encargando a una clase
Adaptee concreta. Como consecuencia, una clase adaptadora no funcionará cuando
se desea adaptar una clase y todas sus subclases.
Permite a los Adapter sobrescribir algo de
comportamiento de Adaptee, ya que Adapter es una subclase de Adaptee.
Un
adaptador de objeto:
Permite que un único Adapter trabaje con muchos
Adaptees, es decir, el Adapter por sí mismo y las subclases (si es que la
tiene). El Adapter también puede agregar funcionalidad a todos losAdaptees de
una sola vez.
Hace difícil sobrescribir el comportamiento de
Adaptee. Esto requerirá derivar Adaptee y hacer que Adapter se refiera a la
subclase en lugar que al Adaptee por sí mismo.
Aquí hay otras cuestiones a considerar cuando se
utiliza el patrón Adapter:
1.¿Cuanta
adaptación hace el Adapter? Adapter varía en la cantidad de
trabajo que hace para adaptar Adaptee a la interfaz Target. Hay un espectro de
trabajo posible, desde una simple conversión (por ejemplo, cambiando los
nombres de las operaciones) hasta soportando un conjunto de operaciones
enteramente diferentes. La cantidad de trabajo que Adapter hace depende de
cuánto de similar tienen la interfaz Target con Adaptee.
2.Adaptadores
Pluggables Una clase es más reusable cuando se minimiza
la suposición de que otras clases deben utilizarla. Mediante la construcción en
una clase de la adaptación de una interfaz, se elimina la suposición de que
otras clases ven la misma interfaz. Dicho de otra manera, la adaptación de la
interfaz nos permite incorporar a nuestra clase en sistemas existentes que
pueden esperar diferentes interfaces de la misma.
Implementación
Crear una nueva clase que será el Adaptador, que
extienda del componente existente e implemente la interfaz obligatoria. De este
modo tenemos la funcionalidad que queríamos y cumplimos la condición de
implementar la interfaz.
La diferencia entre los patrones Adapter y Facade,
es que el primero reutiliza una interfaz ya existente, mientras que el segundo
define una nueva con el objetivo de simplificarla.
package Structural_patterns; public class AdapterWrapperPattern { public static void main(String args[]){ Guitar eGuitar = new ElectricGuitar(); eGuitar.onGuitar(); eGuitar.offGuitar(); Guitar eAGuitar = new ElectricAcousticGuitar(); eAGuitar.onGuitar(); eAGuitar.offGuitar(); } public abstract class Guitar{ abstract public void onGuitar(); abstract public void offGuitar(); } public class ElectricGuitar extends Guitar{ public void onGuitar() { System.out.println("Playing Guitar"); } public void offGuitar() { System.out.println("I'm tired to play the guitar"); } } /** * Class to Adapter/Wrapper */ public class AcousticGuitar{ public void play(){ System.out.println("Playing Guitar"); } public void leaveGuitar(){ System.out.println("I'm tired to play the guitar"); } } /** * we Adapter/Wrapper AcousticGuitar into * ElectricAcousticGuitar to adapt into the GuitarModel */ public class ElectricAcousticGuitar extends Guitar{ AcousticGuitar acoustic = new AcousticGuitar(); public void onGuitar() { acoustic.play(); } public void offGuitar() { acoustic.leaveGuitar(); } } }
No hay comentarios:
Publicar un comentario