design-patterns

Quick-reference guide to software design patterns with concise Dart examples.

View project on GitHub

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