Informatica
O objetivo deste post é apresentar o padrão de projeto state, iniciando a série de padrões de projeto que serão publicados aqui. Afim de ser didático, inciarei com um exemplo e ao final apresentarei a estrutura do padrão.
Suponha que objetos de uma classe transitem por estados em uma máquina de estados. Por exemplo, imagine que uma conexão com um servidor possa transitar pelos estados desconectada, conectada e aguardando resposta, supondo que, uma vez que uma requisição é enviada, a conexão permanece no estado aguardando resposta até que a resposta seja recebida do servidor. Os serviços fornecidos pela classe que representa essa conexão são: conectar, desconectar, enviar requisição e receber resposta. Tal classe se assemelharia àquela representada abaixo.
É fácil perceber que o comportamento da classe deve mudar dependendo do estado em que sua instância se encontra. Por exemplo, caso o objeto esteja no estado conectado ou aguardando resposta e alguém chame a operação "conectar", um erro deve ser gerado. Mas, caso o mesmo método seja chamado quando o objeto estiver no estado desconectado, a conexão deverá ser estabelecida e o estado do objeto deve ser alterado para conectado. O diagrama abaixo apresenta a máquina de estados da conexão, as operações que causam mudança de estado e as operação que devem ser executadas sem erro em cada estado.
Uma solução possível para a mudança de comportamento entre os estados é, em cada método da classe "Conexao", escolher a implementação correta utilizando cláusulas if/else ou switch/case. Porém, ao surgir um novo estado, o desenvolvedor deve tomar o cuidado de incluir a opção correta em cada método, aumentando a possibilidade de inserção de erros na implementação.
O catálogo de padrões de projeto GoF (Gang of Four), cujo o livro irei referenciar no final deste post, propõe o padrão de projeto State para solucionar problemas como o descrito acima. Antes de apresentar a estrutura do padrão,