1. Patrones de Diseño (Facade e Iterator)
Facade
El patrón facade es de tipo estructural y sirve para presentar un interfaz unificada que
representa un set de subinterfaces. Según el sitio web dofactory.com la frecuencia de uso
de este patrón es alta.
Sus principales ventajas son
Hacer que una librería de software sea mas fácil de utilizar ya que el facade tiene
métodos útiles para tareas generales
Envolver una colección de API´s diseñada de una forma en un solo API bien
diseñado.
Para modificar las clases de los subsistemas solo se cambia la fachada
Ejemplo 1
2. Ejemplo 2
Ejemplo de implementación
/* Partes específicas */
class CPU {
public void freeze() { ... }
public void jump(long position) { ... }
public void execute() { ... }
}
class Memory {
public void load(long position, byte[] data) { ... }
}
class HardDrive {
public byte[] read(long lba, int size) { ... }
}
3. /* Fachada */
class ComputerFacade {
private CPU processor;
private Memory ram;
private HardDrive hd;
public ComputerFacade() {
this.processor = new CPU();
this.ram = new Memory();
this.hd = new HardDrive();
}
public void start() {
processor.freeze();
ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR,
SECTOR_SIZE));
processor.jump(BOOT_ADDRESS);
processor.execute();
}
}
/* Client */
class You {
public static void main(String[] args) {
ComputerFacade computer = new ComputerFacade();
computer.start();
}
}
4. Iterator
El patrón de comportamiento iterator provee una interfaz para acceder secuencialmente a un
grupo de objetos de una colección.
Algunas de las funciones más comunes definidas en un iterator son Primero(), Siguiente(),
hayMas(), elementoActual().
Este patrón permite recorrer una estructura de datos sin que sea necesario conocer la estructura
interna de la misma, además de permitir crear métodos personalizados para manejar la lista.
Ejemplo 1
5. Ejemplo de implementación
1: Crear interfaces.
Iterator.java
public interface Iterator {
public boolean hasNext();
public Object next();
}
Container.java
public interface Container {
public Iterator getIterator();
}
2: Crear clase concreta implementando la interfaz contenedor. Esta clase
tiene la clase interna NameIterator implementando la interfaz Iterator.
NameRepository.java
public class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}
6. 3: Usar el NameRepository para conseguir el iterator e imprimir los
nombres.
IteratorPatternDemo.java
public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for(Iterator iter = namesRepository.getIterator();
iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}
4: Verificar la salida
Name : Robert
Name : John
Name : Julie
Name : Lora