Benefits:
• It keeps state-specific behavior local and partitions behavior for different states.
• It makes any state transitions explicit.
Applicable Scenarios:
• The behavior of an object depends on its state and it must be able to change its behavior at runtime according on the new state.
• Operations have large, multipart conditional statements that depend on the state of the object.