O State é um padrão de projeto comportamental que permite que um objeto altere o comportamento quando seu estado interno for alterado.
O padrão extrai comportamentos relacionados ao estado em classes separadas de estado e força o objeto original a delegar o trabalho para uma instância dessas classes, em vez de agir por conta própria.
Vamos aplicar o padrão de design State no contexto das máquinas de venda automática. Para simplificar, vamos supor que a máquina de venda automática tenha apenas um tipo de item ou produto. Além disso, para simplificar, vamos supor que uma máquina de venda automática pode estar em 4 estados diferentes:
hasItem
noItem
itemRequested
hasMoney
Uma máquina de venda automática também terá ações diferentes. Mais uma vez para simplificar, vamos supor que existam apenas quatro ações:
Selecionar o item
Adicionar o item
Inserir dinheiro
Dispensar item
O padrão de design State deve ser usado quando o objeto pode estar em muitos estados diferentes e, dependendo da solicitação de entrada, o objeto precisa alterar seu estado atual.
Em nosso exemplo, uma máquina de venda automática pode estar em muitos estados diferentes, e esses estados mudarão continuamente de um para outro. Digamos que a máquina de venda automática esteja em itemRequested. Uma vez que a ação “Inserir dinheiro” ocorre, a máquina se move para o estado hasMoney.
Dependendo de seu estado atual, a máquina pode se comportar de maneira diferente para as mesmas solicitações. Por exemplo, se um usuário deseja comprar um item, a máquina irá prosseguir se estiver em hasItemState ou rejeitará em noItemState.
O código da máquina de venda automática não se polui com essa lógica; todo o código dependente de estado vive nas respectivas implementações de estado.