Essential Java Design Patterns Implementation

Composite Pattern

interface AComponent { int size(); }


public class File implements AComponent { private String name; private int size; public File(String name, int size) { super(); this.name = name; this.size = size; } public int size() { return size; } }


public class Directory implements AComponent { private List<AComponent> children; public Directory(String name) { children = new LinkedList<>(); } public int size() { int result = 0; for (AComponent child : children) result = result + child.size(); return result; } }

Strategy Pattern

public interface Strategy { int doOperation(int num1, int num2); }


public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2) { return strategy.doOperation(num1, num2); } }


public class OperationAdd implements Strategy { @Override public int doOperation(int num1, int num2) { return num1 + num2; } }

Adapter Pattern

public class Usb { public int getPower() { return 1; } }


public class CigaretteLighterReceptacle { public int getEnergy() { return 2; } }


public class UsbToCarAdapter extends Usb { private CigaretteLighterReceptacle carInterface; public UsbToCarAdapter(CigaretteLighterReceptacle carInterface) { this.carInterface = carInterface; } public int getPower() { return carInterface.getEnergy(); } }

Iterator Pattern

public interface Container { public Iterator getIterator(); }


interface Iterator { boolean hasNext(); Object next(); }


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() { return index < names.length; } @Override public Object next() { if (this.hasNext()) { return names[index++]; } return null; } } }

Observer Pattern

interface Observer { void update(int newValue); }


public class Subject { private List<Observer> observers = new ArrayList<>(); public void setState(int state) { this.state = state; notifyAllObservers(state); } public void attach(Observer observer) { observers.add(observer); } public void notifyAllObservers(int state) { for (Observer observer : observers) { observer.update(state); } } }

Abstract Factory Pattern

interface Boton { void pintar(); } interface Ventana { void abrir(); }


class BotonWindows implements Boton { } class VentanaWindows implements Ventana { }


class BotonLinux implements Boton { } class VentanaLinux implements Ventana { }


interface GUIFactory { Boton crearBoton(); Ventana crearVentana(); }

Visitor Pattern

interface Person { void accept(TaxiVisitor v); } interface TaxiVisitor { void visit(HastyPerson e); void visit(LeisurelyPerson e); }

State Pattern

public interface PackageState { void next(Package pkg); void prev(Package pkg); void printStatus(); }