design-patterns

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

View project on GitHub

Allows an object to change its behavior when its internal state changes.

The object appears to change its class.

abstract class PlayerState {
  void pressPlay(MusicPlayer player);
}

class StoppedState implements PlayerState {
  @override
  void pressPlay(MusicPlayer player) {
    print('Starting playback');
    player.state = PlayingState();
  }
}

class PlayingState implements PlayerState {
  @override
  void pressPlay(MusicPlayer player) {
    print('Pausing playback');
    player.state = StoppedState();
  }
}

class MusicPlayer {
  PlayerState state = StoppedState();

  void pressPlay() => state.pressPlay(this);
}

// Usage
final player = MusicPlayer();
player.pressPlay(); // Starting playback
player.pressPlay(); // Pausing playback
player.pressPlay(); // Starting playback