Ejemplo de inversión de control en Java

robotics-2180263_1920

Supongamos que tenemos varios módulos y todos requieren usar un mismo servicio o recurso. ¿Qué hacemos? ¿Escribimos líneas y más líneas de código para hacer exactamente las mismas tareas? Podría ser. Pero sería muy tedioso. Para ahorrar escribir y escribir lo mismo podemos optar por usar patrones de diseño.

Inversión de control (for Dummies):

Básicamente es un patrón de diseño que nos permite desacoplar unos módulos de otros.

Ejemplo. Crearemos una interface (una clase puramente abstracta en Java) y dos clases que la implementen, después una clase llamada Contenedor que hará uso de esa interface y tendrá sus propios métodos. Finalmente una clase principal llamada Main que servirá para ejecutar la aplicación.

Servicio.java

/**
*
*@description Clase puramente abstracta
*/
package com.codemonkey;
public interface Servicio{

public abstract void mensaje();

}

ServicioImplA.java

/**
*
*@description Implementación de Servicio
*/
package com.codemonkey;
import static java.lang.System.out;

public class ServicioImplA implements Servicio {

@Override public void mensaje(){

out.println("Mensaje desde clase ServicioImplA");

}

}

ServicioImplB.java

/**
*
*@description Implementación de Servicio
*/
package com.codemonkey;
import static java.lang.System.out;

public class ServicioImplB implements Servicio {

@Override public void mensaje(){

out.println("Mensaje desde clase ServicioImplB");

}

}

Contenedor.java

/**
*@description Clase Contenedor
*
*/
package com.codemonkey;
public class Contenedor{

private Servicio servicio;

public Contenedor(Servicio servicio){

this.servicio=servicio;

}

public void mensaje(){

servicio.mensaje();

}

}

Main.java

/**
*
*@description Clase principal
*/
package com.codemonkey;
public class Main{

public static void main(String[] args){

Servicio servImplA = new ServicioImplA();

Servicio servImplB = new ServicioImplB();

Contenedor contenedor = new Contenedor(servImplA);

contenedor.mensaje(); //implementación: ServicioImplA

contenedor = new Contenedor(servImplB);

contenedor.mensaje(); //implementación: ServicioImplB

}

}

En conclusión, el contenedor (Contenedor.java) debería poder gestionar cualquier objeto, cualquier valor o argumento de cualquier método de cualquier clase.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s