59 lines
2.0 KiB
Java
59 lines
2.0 KiB
Java
package composite;
|
|
|
|
/**
|
|
* Composite Design Pattern — Runnable Demo
|
|
*
|
|
* Builds a file system tree with nested directories and files.
|
|
* Demonstrates that getSize() and print() work uniformly on
|
|
* leaves (File) and composites (Directory) without any instanceof checks.
|
|
*
|
|
* Run: javac composite/*.java && java composite.Main
|
|
* Article: https://ankurm.com/composite-design-pattern-java/
|
|
*/
|
|
public class Main {
|
|
|
|
public static void main(String[] args) {
|
|
System.out.println("=== Composite Design Pattern Demo ===\n");
|
|
|
|
// Build a file system tree
|
|
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 entire tree — recursion happens automatically
|
|
System.out.println("File system tree:");
|
|
root.print("");
|
|
|
|
System.out.printf("%nTotal project size: %,d bytes%n", root.getSize());
|
|
|
|
// Client treats File and Directory identically
|
|
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 ===");
|
|
}
|
|
}
|