package composite; public class Main { public static void main(String[] args) { System.out.println("=== Composite Design Pattern Demo ===\n"); // Build the tree — mix files and directories freely Directory root = new Directory("project"); Directory src = new Directory("src"); Directory main = new Directory("main"); main.add(new File("App.java", 4_200)) .add(new File("Config.java", 1_800)) .add(new File("Application.yml", 3_100)); Directory test = new Directory("test"); test.add(new File("AppTest.java", 2_600)) .add(new File("ConfigTest.java", 1_200)); src.add(main).add(test); Directory resources = new Directory("resources"); resources.add(new File("application.yml", 1_500)) .add(new File("logback.xml", 900)) .add(new File("banner.txt", 200)); root.add(src) .add(resources) .add(new File("pom.xml", 8_400)) .add(new File("README.md", 2_100)); // Print the entire tree — recursion is automatic System.out.println("File system tree:"); root.print(""); System.out.printf("%nTotal project size: %,d bytes%n", root.getSize()); // The key demonstration: File and Directory through the same interface System.out.println("\n-- Treating File and Directory uniformly --"); FileSystemItem[] items = { new File("standalone.txt", 500), src }; for (FileSystemItem item : items) { System.out.printf("%s -> size: %,d bytes%n", item.getName(), item.getSize()); } System.out.println("\n=== Demo complete ==="); } }