Design Patterns Catalog

Simplificando o que não é complicado

State

O design pattern State permite que um objeto altere o seu comportamente de acordo com as variações de seu estado interno.

Imagine um jogo do tipo pac-man, onde os fantasmas podem assumir alguns tipos de comportamento distintos: seguir o menor caminho até o jogador, andar randomicamente e andar próximo às pílulas. Mas se você prestar atenção vai ver que no pac-man os fantasmas revezam o tipo de comportamento, mudam suas estratégias periodicamente.

Podemos implementar este tipo de comportamente seguindo o design pattern Strategy, imaginando que cada um dos fantasmas tem três estados distintos (StateRandom, StateChase e StatePills).

Cada estado será a implementação de uma interface State. E cada um dos fantasmas são instâncias de uma classe Ghost, que por sua vez guarda sempre uma instância de uma State concreta.

A hierarquia de classes é mostrada abaixo:

State Pattern - Diagra de Classes

A classe Ghost possui um método move que simplesmente invoca o método handleNextStep da sua classe State concreta. E quando o sistema (no caso o jogo) invoca o método changeState da classe Ghost, ela simplesmente altera a referência que possui para a classe State internamente.

State Pattern - Diagra de Sequencia

Com isso a classe Ghost pode assumir um comportamento completamente diferente e isolado a cada troca de estado. Não é necessário fazer grandes cadeiras de ifs para determinar o que fazer em função do seu estado, além de permitir que a mudança de estado seja atômica (basta trocar a referência ao seu State concreto).

Páginas Relacionadas: