Quizá uno de los temas que para muchas personas es más complejo a la hora de desarrollar aplicaciones es el uso de patrones de diseño. Los patrones de diseño son soluciones de ingeniería de software a problemas recurrentes en el mundo del desarrollo. Cuando aparece el problema X se suele solventar con el patrón de diseño Y. Hoy voy a cubrir en este artículo uno de los patrones más sencillos: el patrón fachada.
Uso de fachadas
¿Qué es una fachada o facade en inglés?. Es un patrón de diseño que nos permite simplificar el interface de comunicación entre dos objetos A y B de tal forma que para el objeto A sea más sencillo interactuar con el objeto B. Supongamos que tenemos las siguientes clases:
Vamos a ver el código de Impresora (Java):
package com.genbetadev;
public class Impresora {
private String tipoDocumento;
private String hoja;
private boolean color;
private String texto;
public String getTipoDocumento() {
return tipoDocumento;
}
public void setTipoDocumento(String tipoDocumento) {
this.tipoDocumento = tipoDocumento;
}
public String getHoja() {
return hoja;
}
public void setHoja(String hoja) {
this.hoja = hoja;
}
public boolean isColor() {
return color;
}
public void setColor(boolean color) {
this.color = color;
}
public String getTexto() {
return texto;
}
public void setTexto(String texto) {
this.texto = texto;
}
public void imprimirDocumento() {
System.out.println("imprimiendo:"+ texto+ ",color:"
+ color+",tipo:"+tipoDocumento+",hoja :"+hoja);
}
}
Se trata de una clase sencilla que imprime documentos en uno u otro formato. El código de la clase cliente nos ayudará a entender mejor su funcionamiento.
package com.genbetadev;
public class PrincipalCliente {
public static void main(String[] args) {
Impresora i = new Impresora();
i.setHoja("a4");
i.setColor(true);
i.setTipoDocumento("pdf");
i.setTexto("texto 1");
i.imprimirDocumento();
Impresora i2 = new Impresora();
i2.setHoja("a4");
i2.setColor(true);
i2.setTipoDocumento("pdf");
i2.setTexto("texto 2");
i2.imprimirDocumento();
Impresora i3 = new Impresora();
i3.setHoja("a3");
i3.setColor(false);
i3.setTipoDocumento("excel");
i3.setTexto("texto 3");
i3.imprimirDocumento();
}
}
Como podemos ver la clase cliente se encarga de invocar a la impresora, y configurarla para después imprimir varios documentos .Ahora bien prácticamente todos los documentos que escribimos tienen la misma estructura (formato A4, Color , PDF). Estamos continuamente repitiendo código. Vamos a construir una nueva clase FachadaImpresoraNormal que simplifique la impresión de documentos que sean los más habituales.
package com.genbetadev;
public class FachadaImpresoraNormal {
Impresora impresora;
public FachadaImpresoraNormal(String texto) {
super();
impresora= new Impresora();
impresora.setColor(true);
impresora.setHoja("A4");
impresora.setTipoDocumento("PDF");
impresora.setTexto(texto);
}
public void imprimir() {
impresora.imprimirDocumento();
}
}
De esta forma el cliente quedará mucho más sencillo :
package com.genbetadev;
public class PrincipalCliente2 {
public static void main(String[] args) {
FachadaImpresoraNormal fachada1= new FachadaImpresoraNormal("texto1");
fachada1.imprimir();
FachadaImpresoraNormal fachada2= new FachadaImpresoraNormal("texto2");
fachada2.imprimir();
Impresora i3 = new Impresora();
i3.setHoja("a4");
i3.setColor(true);
i3.setTipoDocumento("excel");
i3.setTexto("texto 3");
i3.imprimirDocumento();
}
}
Diseño de patrones e inmutabilidad
Una de las ventajas que tienen los patrones de diseño es su INMUTABILIDAD ya que no cambian aunque cambiemos de lenguaje de programación. Lo creamos o no en muchos casos nos rodean en la programación del día a día. Por ejemplo muchas veces la gente me pregunta ¿Qué es mejor cuando realizamos una petición ajax con JQuery? ¿Usar $.ajax() o usar $.get(), $.post()? .
var peticion = $.ajax( "destino.php" ).done(function() {
alert( "ok" );
})
var peticion2 = $.get( "destino.php",function() {
alert( "ok" );
});
var peticion3 = $.post( "destino.php",function() {
alert( "ok" );
});
Rapidamente aparecen dudas .¿Por qué JQuery tiene métodos tan similares?. Revisando los patrones de diseño podremos ver que $.get() y $.post() son fachadas sobre $.ajax() y que este admite muchos tipos de configuraciones.
En Genbeta Dev | Android Patterns: patrones de diseño para desarrollar aplicaciones Android, Los patrones de diseño de software