// Purpose. Domain layer to Towers of Hanoi - OO solution import java.util.List; import java.util.ArrayList; interface ComponentMove { void recurse( List l ); } class CompositeMove implements ComponentMove { private ArrayList children = new ArrayList(); public CompositeMove( int size, int from, int to, int aux ) { if (size == 1) { children.add( new LeafMove(from,to) ); return; } children.add( new CompositeMove( size-1, from, aux, to ) ); children.add( new LeafMove(from,to) ); children.add( new CompositeMove( size-1, aux, to, from ) ); } public void recurse( List l ) { for (int i=0; i < children.size(); i++) ((ComponentMove)children.get(i)).recurse( l ); } } class LeafMove implements ComponentMove { public int from, to; public LeafMove( int f, int t ) { from = f; to = t; } public void recurse( List l ) { l.add( this ); } } class TowersOfHanoiOO { public static void main( String[] args ) { int size = 5; if (args.length > 0) size = Integer.parseInt( args[0] ); List instructions = new ArrayList(); CompositeMove root = new CompositeMove( size, 0, 2, 1 ); root.recurse( instructions ); new TowersOfHanoiPresentation( size, instructions ); } }