El patrón de diseño Adapter
El patrón de diseño adapter es un de tipo interfaz y su implementación resuelve el problema de agregar una nueva implementación ha un código ya escrito.
El ejemplo más claro es cuando quiere cambiar un proveedor de servicios, imagina que tienes un contrato con la empresa X pero la empresa Y te da mejores beneficios, cambiar todo el desarrollo agregaría muchas horas de trabajo por lo cual generas una nueva interfaz y para heredar funcionalidad ya sea por clase o por objeto de la siguiente forma.
Tenemos la siguiente implementación que parecería normal en muchos lugares; una clase interfaz PayOne y su implementación en la clase PayOneImp.
public interface PayOne {
public void methodOne();
}
public class PayOneImp implements PayOne {
public void methodOne() {
System.out.println("methodOne()");
}
}
public class RunAdapterExample {
public static void main(String[] args) {
//-- First Implementation
System.out.println("First Implementation");
PayOne payOne = new PayOneImp();
payOne.methodOne();
}
}
Implementación adapter
La implementación del adapter puede ser por clase o por objeto
Para empezar hay que agregar una nueva interfaz PayTwo
public interface PayTwo {
public void methodOne_();
public void methodTwo();
}
Implemetación por clase
En este tipo de implementación la clase hereda de PayOneImp e implementa la interfaz PayTwo
public class PayTwoImpAdapterByClass extends PayOneImp implements PayTwo {
public void methodTwo() {
System.out.println("methodTwo()");
}
public void methodOne_() {
this.methodOne();
}
}
public class RunAdapterExample {
public static void main(String[] args) {
//-- Implementation Adapter By Class
System.out.println("Adapter Implementation by class");
PayTwo payTwoByClass = new PayTwoImpAdapterByClass();
payTwoByClass.methodOne_();
payTwoByClass.methodTwo();
}
}
Implementación por objeto
La implementación por objeto se instancia de la clase PayOneImp y se implementa de la interfaz PayTwo
public class PayTwoImpAdapterByObject implements PayTwo {
private PayOne payOne;
public PayTwoImpAdapterByObject(){
this.payOne = new PayOneImp();
}
public void methodOne_() {
this.payOne.methodOne();
}
public void methodTwo() {
System.out.println("methodTwo()");
}
}
public class RunAdapterExample {
public static void main(String[] args) {
//-- Implementation By Object
System.out.println("Adapter Implementation by object");
PayTwo payTwoByObject = new PayTwoImpAdapterByObject();
payTwoByObject.methodOne_();
payTwoByObject.methodTwo();
}
}
Y de esta forma implementamos en dos formas el patrón Adapter