2912. Design Pattern - Composite
Composite Pattern
Structural Pattern: Composite Pattern.
1. Composite Pattern
The Composite pattern is used where we need to treat a group of objects in similar way as a single object. Composite pattern composes objects in term of a tree structure to represent part as well as whole hierarchy.
2. Example
public class File { private String name; public File(String name) { this.name = name; } public void ls() { System.out.println("File:" + name); } } public class Directory { private String name; private ArrayList includedFiles = new ArrayList(); public Directory(String name) { this.name = name; } public void add(Object obj) { includedFiles.add(obj); } public void ls() { System.out.println("Directory: " + name); for (Object obj : includedFiles) { // Recover the type of this object String name = obj.getClass().getSimpleName(); if (name.equals("Directory")) { ((Directory)obj).ls(); } else { ((File)obj).ls(); } } } } public class ProblematicClient { public void run() { Directory music = new Directory("MUSIC"); Directory scorpions = new Directory("SCORPIONS"); Directory dio = new Directory("DIO"); File track1 = new File("Don't wary, be happy.mp3"); File track2 = new File("track2.m3u"); File track3 = new File("Wind of change.mp3"); File track4 = new File("Big city night.mp3"); File track5 = new File("Rainbow in the dark.mp3"); music.add(track1); music.add(scorpions); music.add(track2); scorpions.add(track3); scorpions.add(track4); scorpions.add(dio); dio.add(track5); music.ls(); } }
With Composite Pattern.
public interface AbstractFile { void ls(); } public class File implements AbstractFile { private String name; public File(String name) { this.name = name; } public void ls() { System.out.println("File:" + name); } } public class Directory implements AbstractFile { private String name; private ArrayList includedFiles = new ArrayList(); public Directory(String name) { this.name = name; } public void add(Object obj) { includedFiles.add(obj); } public void ls() { System.out.println("Directory: " + name); for (Object includedFile : includedFiles) { // Leverage the "lowest common denominator" AbstractFile obj = (AbstractFile)includedFile; obj.ls(); } } } public class Client { public void run() { Directory music = new Directory("MUSIC"); Directory scorpions = new Directory("SCORPIONS"); Directory dio = new Directory("DIO"); File track1 = new File("Don't wary, be happy.mp3"); File track2 = new File("track2.m3u"); File track3 = new File("Wind of change.mp3"); File track4 = new File("Big city night.mp3"); File track5 = new File("Rainbow in the dark.mp3"); music.add(track1); music.add(scorpions); music.add(track2); scorpions.add(track3); scorpions.add(track4); scorpions.add(dio); dio.add(track5); music.ls(); } }