design-patterns

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

View project on GitHub

Provides a do-nothing object as a default, eliminating null checks.

A “safe” stand-in that does nothing instead of blowing up.

abstract class Logger {
  void log(String message);
}

class ConsoleLogger implements Logger {
  @override
  void log(String message) => print('LOG: $message');
}

class NullLogger implements Logger {
  @override
  void log(String message) {} // does nothing
}

class App {
  final Logger logger;
  App({Logger? logger}) : logger = logger ?? NullLogger();

  void run() {
    logger.log('App started'); // safe, never null
  }
}

// Usage
App().run();                           // silent (NullLogger)
App(logger: ConsoleLogger()).run();    // LOG: App started