State

Descrição:

State, ou Estado, é um padrão de projeto que permite a um objeto alterar seu comportamento quando seu estado interno muda. Quando analisado por fora, o objeto aparentará que está mudando suas classes.

Diagrama de Classes genérico do padrão:

State

Exemplo:

A ideia do exemplo apresentada no livro consiste num sistema de controle para uma máquina distribuidora de chicletes, aqueles que se poem uma moeda, gira a catraca e pega o chiclete.

Esta atividade parece bem simples, mas é preciso tomar algumas precauções para que a máquina funcione corretamente, como por exemplo:

  1. Não pode dar doces se não houver uma moeda.
  2. Não pode colocar duas moedas na máquina simultâneamente.
  3. Não pode ejetar uma moeda que não está na máquina.
  4. Não se pode distribuir mais de um doce por girada de catraca.

Para isso, é preciso analisar os estados que a máquina possui e então separá-las em classes diferentes dentro da uml, cada uma possuindo um comportamento para quando não existe uma moeda(NO_QUARTER), quando existe uma moeda(HAS_QUARTER), quando se vende um chiclete(SOLD) e quando não existem mais chicletes na máquina(SOLD_OUT).

Cada um desses Estados que atualmente estão separados na uml, estarão juntas dentro de uma grande classe chamada de gumball_machine, classe que controlará esses estados, dentro do padrão esta classe seria o context.

A gumball_machine irá identificar quando uma moeda é colocada e mudará o estado interno da classe para HAS_QUARTER, e todos os comportamentos para quando se coloca uma moeda, se tira, gira a catraca e libera o chiclete corresponderão a esse estado, o mesmo quando não existe moeda, quando se vende um chiclete e quando não existe mais nenhum na máquina.

Diagrama de Classes do exemplo:

State

Ver código fonte no Github