Diseño con patrones y fachadas

Diseño con patrones y fachadas
Sin comentarios Facebook Twitter Flipboard E-mail

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:

cliente-impresora

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.

fachada-impresora
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.

fachadas-jquery

En Genbeta Dev | Android Patterns: patrones de diseño para desarrollar aplicaciones Android, Los patrones de diseño de software

Comentarios cerrados
Inicio