Composite Design Pattern in Java
Composite design pattern
A static attribute in the Entity base class can be manipulated by each Box object to control indentation.
abstract class Entity { protected static StringBuffer indent = new StringBuffer(); protected static int level = 1; public abstract void traverse(int[] levels); protected boolean printThisLevel(int[] levels) { for (int value : levels) { if (level == value) { return true; } } return false; } } class Product extends Entity { private int value; public Product(int value) { this.value = value; } public void traverse(int[] levels) { if (printThisLevel(levels)) { System.out.println(indent.toString() + value); } } } class Box extends Entity { private List children = new ArrayList(); private int value; public Box(int val) { value = val; } public void add(Entity c) { children.add(c); } public void traverse(int[] levels) { if (printThisLevel(levels)) { System.out.println(indent.toString() + value); indent.append( " " ); } level++; for (Object child : children) { ((Entity)child).traverse(levels); } level--; if (printThisLevel(levels)) { indent.setLength(indent.length() - 3); } } } public class CompositeDemo { public static void main(String[] args) { Box root = initialize(); int[] levels = new int[args.length]; for (int i=0; i < args.length; i++) { levels[i] = Integer.parseInt(args[i]); } root.traverse( levels ); } private static Box initialize() { Box[] nodes = new Box[7]; nodes[1] = new Box( 1 ); int[] waves = {1, 4, 7}; for (int i=0; i < 3; i++) { nodes[2] = new Box(21+i); nodes[1].add(nodes[2]); int level = 3; for (int j=0; j < 4; j++) { nodes[level-1].add( new Product(level*10 + waves[i])); nodes[level] = new Box(level*10 + waves[i]+1); nodes[level-1].add(nodes[level]); nodes[level-1].add(new Product(level*10 + waves[i]+2)); level++; } } return nodes[1]; } } Output
args -> 2 4 6 21 41 42 61 62 63 43 22 44 45 64 65 66 46 23 47 48 67 68 69 49 args -> 3 6 31 32 61 62 63 33 34 35 64 65 66 36 37 38 67 68 69 39 args -> 1 2 3 4 5 6 1 21 31 32 41 42 51 52 61 62 63 53 43 33 22 34 35 44 45 54 55 64 65 66 56 46 36 23 37 38 47 48 57 58 67 68 69 59 49 39
