Como discutimos aqui antes, os padrões de projeto são classificados em três categorias distintas: criacionais, estruturais e comportamentais. O padrão de design Chain of Responsability se enquadra na categoria comportamental e pode ser usado para reduzir o acoplamento entre o remetente de uma solicitação e o objeto receptor que trata a solicitação.
Definição do Gang of Four:
O padrão Chain of Responsability visa evitar o acoplamento do remetente de uma solicitação ao seu receptor, dando a mais de um objeto a oportunidade de lidar com a solicitação, encadeie os objetos e passe a solicitação ao longo da cadeia até que um objeto o trate.
1- O Handler define uma interface para lidar com solicitações.
2- Os objetos ConcreteHandler podem, cada um, lidar com uma solicitação e acessar seu objeto sucessor.
3- O client inicia a solicitação para um objeto ConcreteHandler.
O padrão em questão permite determinar qual objeto tratará a solicitação durante a execução, onde cada objeto pode ou não tratar e/ou passar a mensagem para o próximo conforme o encadeamento.
Exemplo
Simulando um chamado, onde o objeto (Ticket de Atendimento) é tratado conforme as condições do solicitante. A demanda pode passar pelos cargos de Analista, Especialista Técnico e Gerente de Área.
1- Instanciando uma lista de objetos que simulam os chamados.
2- Nesse momento temos a criação da figura do Atendente. Notem que a variável ‘vAtendente’ é uma Interface, assim como o ‘Encadeamento’ dos objetos via construtor. Aqui é formado o encadeamento.
3- Temos a classe ‘TicketAtendimento’, que contém os atributos com as informações do Ticket.
4- Classe ‘ResultadoDaAnalise’ retorna o atendente e seu status (‘Resolvido’ Falso ou verdadeiro).
5- Interface que recebe qualquer das classes a serem instanciadas (‘Analista’, ‘EspecialistaTecnico’ e ‘GerenteArea’). Notem que há a assinatura ‘Resultado’.
6- Classe ‘Analista’ que implementa a interface ‘IAtendente’.
7,8- Aqui temos a variável ‘Proximo’, que recebe via construtor o objeto seguinte que tratará a demanda conforme o fluxo. Se trata da interface ‘IAtendente’.
9- Dentro da classe ‘Analista’ há a implementação do método ‘Resultado’, que contém as particularidades da classe ‘Analista’.
10- Na regra em questão observamos a regra que em caso do tamanho ser > 500, ele chama o método ‘Resultado’ da variável (interface) ‘Proximo’. Nesse momento é que ocorre o encadeamento.
11,12 – No fluxo em questão, após a classe ‘Analista’ não conseguir tratar a demanda (>500), a classe ‘EspecialistaTecnico’ é chamada.
13- Novamente nós temos a regra particular da classe, e caso não seja atendida (>1000), o encadeamento é feito para a classe ‘GerenteArea’.
Resumo
O padrão Chain of Responsibility permite que objetos em uma cadeia passem pela manipulação os objetos encadeados. A solicitação flui pela cadeia até que um link da cadeia a trate.
Aplicabilidade
Use o padrão quando for essencial executar vários manipuladores em uma ordem específica, onde todas as solicitações passarão pela cadeia exatamente como você planejou.
Show amigo!
Obrigado, Cesar !