Contexto: Supongamos que implementamos un intérprete para un lenguaje X. Este intérprete permite ejecutar programas en X desde un lenguaje anfitrión, en este caso Java. Si deseas hacer el ejemplo más real, imagina que X es un lenguaje de consulta de datos, similar a SQL. Para ejecutar programas en X desde un código en Java, son necesarios los siguientes pasos:
Scanner s = new Scanner("prog1.x"); Parser p = new Parser(s); AST ast = p.parse(); CodeGenerator code = new CodeGenerator(ast); code.eval();
Problema: Como el lenguaje X se está volviendo popular, los desarrolladores se quejan de la complejidad del código anterior, ya que requiere conocimiento de clases internas del intérprete de X. Por lo tanto, los usuarios frecuentemente solicitan una interfaz más simple para invocar el intérprete del lenguaje X.
Solución: El patrón de diseño Fachada es una solución para nuestro problema. Una Fachada es una clase que ofrece una interfaz más simple para un sistema. El objetivo es evitar que los usuarios necesiten conocer las clases internas de ese sistema; en su lugar, solo deben interactuar con la clase Fachada. Las clases internas quedan encapsuladas detrás de esta Fachada.
En nuestro problema, la Fachada podría ser:
class InterpretadorX { private String arq; InterpretadorX(arq) { this.arq = arq; } void eval() { Scanner s = new Scanner(arq); Parser p = new Parser(s); AST ast = p.parse(); CodeGenerator code = new CodeGenerator(ast); code.eval(); } }
De esta manera, los desarrolladores que necesitan ejecutar programas en X desde Java podrán hacerlo mediante una única línea de código:
new InterpretadorX("prog1.x").eval();
Antes de implementar la Fachada, los clientes necesitaban crear tres objetos de tipos internos del intérprete y llamar a dos métodos. Ahora, basta con crear un solo objeto y llamar a `eval`.