Composes objects into tree structures so individual objects and groups are treated uniformly.
Think file system: files and folders are both “entries”.
abstract class FileSystemEntry {
String get name;
int get size;
}
class File extends FileSystemEntry {
@override
final String name;
@override
final int size;
File(this.name, this.size);
}
class Folder extends FileSystemEntry {
@override
final String name;
final List<FileSystemEntry> children = [];
Folder(this.name);
void add(FileSystemEntry entry) => children.add(entry);
@override
int get size => children.fold(0, (sum, e) => sum + e.size);
}
// Usage
final root = Folder('root')
..add(File('a.txt', 100))
..add(Folder('sub')..add(File('b.txt', 200)));
print(root.size); // 300