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