Facade

1 Sinopsis

Crea una interfase a un conjunto de clases.

2 Contexto

Se necesita codificar un SistemaOperativo. El SistemaOperativo esta compuesto de un Planificador, AdministradorMemoria, SistemaArchivos. Cada una de esas clases tiene un metodo para procesar, cargar y almacenar programas ejecutables. Se necesita exponer cada funcionalidad via la clase SistemaOperativo

3 Solucion

Construir una clase Facade, que incluya o agregue todas las clases necesarias. Dicha clase provee un conjunto de metodos y para implantarlos, le delega el servicio a otros objetos.

4 Consecuencias

Es posible ocultar la arquitectura de un sistema de informacion, y los clientes solo conocen los servicios de la arquitectura de informacion.

5 Ejemplo

Una clase denominada Programa, contiene codigo maquina, se necesita ejecutar en el CPU de una computadora, almacenarlo en memoria RAM y cargarlo del disco duro.


public class Programa  {
    ....
}
See the complete code for Programa here.
 public String codigo() {
   return "mv ax,1";
 }

La clase Planificador, AdministradorMemoria y SistemaArchivos permite cargar un programa a un CPU, Memoria RAM y Disco Duro respectivamente.


public class Planificador  {
    ....
}
See the complete code for Planificador here.
  public void planificar(Programa pr) { System.out.println("Planificando "+pr.codigo()); }

public class AdministradorMemoria  {
    ....
}
See the complete code for AdministradorMemoria here.
  public void cargar(Programa pr) { System.out.println("Cargando "+pr.codigo()); }

public class SistemaArchivos  {
    ....
}
See the complete code for SistemaArchivos here.
  public void leer(Programa pr) { System.out.println("Leyendo de disco "+pr.codigo()); }

La clase SistemaOperativo es una clase Facade, que declara una instancia privada de cada objeto y expone sus llamadas al sistema operativo


public class SistemaOperativo  {
    ....
}
See the complete code for SistemaOperativo here.
  private static Planificador scheduler = new Planificador();
  private static AdministradorMemoria memoriavirtual = new AdministradorMemoria();
  private static SistemaArchivos filesystem = new SistemaArchivos();
  public static void exec(Programa pr) { scheduler.planificar(pr); }
  public static void mmap(Programa pr) { memoriavirtual.cargar(pr); }
  public static void read(Programa pr) { filesystem.leer(pr); }

Y un programa que invoque llamadas al sistema operativo


public class Shell  {
    ....
}
See the complete code for Shell here.
public static void main(String[] args) {
  Programa pr = new Programa();
  SistemaOperativo.read(pr);
  SistemaOperativo.mmap(pr);
  SistemaOperativo.exec(pr);
}