BehavioralBehavioralPatterns–ChainofResponsabilityPatterns...

14
13-mai-09 Leandro Tonietto 161 Behavioral Patterns – Chain of Responsability Behavioral Behavioral Patterns Patterns Chain Chain of of Responsability Responsability Evitar o acoplamento entre o remetente de uma requisição e os possíveis destinatários desta requisição. Mais de um objeto pode atender a requisição de processamento. A requisição passa por toda uma cadeia de possíveis responsáveis até ser atendida pelo seu responsável ou destinatário. Um característica muito interessante é que a cadeia pode ser montada em tempo de execução, o que permite uma processo mais dinâmico.

Transcript of BehavioralBehavioralPatterns–ChainofResponsabilityPatterns...

Page 1: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 161

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Evitar o acoplamento entre o remetente de uma requisição e os possíveis destinatários desta requisição.Mais de um objeto pode atender a requisição de processamento. A requisição passa por toda uma cadeia de possíveis responsáveis até ser atendida pelo seu responsável ou destinatário.Um característica muito interessante é que a cadeia pode ser montada em tempo de execução, o que permite uma processo mais dinâmico.

Page 2: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 162

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo em [1]:Considere uma aplicação com help sensível ao contexto.Para cada dialog, por exemplo, existe um botão “Ajuda” que, quando acionado exibe a ajuda específica do contexto aonde o usuário se encontra (algum campo específico) e de acordo com o que ele digitou.Portanto, uma de várias possibilidades deve ser exibida ao usuário. Ainda, como as possibilidades podem mudar de acordo com a janelae o contexto, elas montadas dinamicamente.Uma decisão importante de projeto é que as requisições sejam organizadas na ordem de tratamento: mais específico até menos específico.

Isso evita que a requisição seja atendida por um responsável mais genérico que também por tratar a requisição, mas não o tratamento mais adequado para a requisição.

Chain of responsability pode ser utilizado para representar esta lista de possibilidades dinâmica, onde um possível responsável invoca o próximo, caso ele não possa atender a requisição.

Page 3: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 163

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo em [1]:

Do tratamento mais específico para o menos específico ou genérico. Desta forma, a requisição é atendida pelo nível mais específico o possível de contexto.

Page 4: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 164

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo em [1]:

Processo: cada handler (candidato a responsável) verifica se pode “atender” a requisição, caso negativo, ele invoca o próximo para verificar e assim por diante.

Page 5: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 165

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Estrutura básica:

Page 6: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 166

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Aplicação:Mais de um objeto pode atender uma requisição e não se pode saber a priori.Uma requisição deve ser atendida sem que se especifique explicitamente quem vai atende-la.O conjunto de objetos que pode atender uma requisição deve ser montado dinamicamente.

Page 7: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 167

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Conseqüências:Reduz acoplamento entre solicitante da e atendente da requisição. Um não tem conhecimento sobre o outro.Montagem da cadeia em tempo de execução permite adicionar responsáveis dinamicamente. Uma cadeia específica pode ser formada para atender uma requisição em tempo de execução.Pontos de atenção:

Requisição pode não ser atendidaO não atendimento pode ter sido causado por erro na montagem da cadeia.

Page 8: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 168

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Questões de implementação:Os objetos atendentes seguem uma interface padrão. Por exemplo, Handler. Que possui um método para análise da requisição e tratamento da mesma, ou para invocar o seu sucessor.Via de regra o padrão é implementado como uma lista encadeada ou com árvores (composite de responsáveis). Lista seqüencial também pode ser utilizada.É possível, também, deixar que mais de um responsável atenda a requisição de alguma maneira, basta não interromper o fluxo da cadeia.

Page 9: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 169

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo:Um jogo de xadrez (ou outro qualquer) que tenha um conjunto de regras de validar uma jogada feita pelo usuário.Num tabuleiro de xadrez o jogador pode tentar movimentar qualquer peça a qualquer tempo, porém a jogada só será válida se:

O movimento desejado for permitido para o tipo de peça movimentado.Se a posição de destino não estiver bloqueada por uma outra peça do próprio time.Se o caminho não está bloqueado da origem até o destino da movimentação no tabuleiro.Se passar pelas regras especiais de cada peça. Por exemplo, para o movimento em duas casas do peão, se for o primeiro movimento da peça.O Rei não pode ficar em xeque.

Cada peça possui a própria cadeia de regras, que pode montada em tempo de execução de acordo com o tipo de peça e o movimento desejado. As regras são implementas em classes separadas. A jogada só será valida se passar por todos os objetos de validação. Naquele objeto em que foi detectada alguma falha no movimento, a jogada é invalidada e o usuário é alertado.

Page 10: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 170

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo:Por exemplo de composição de regras para a Rainha:1. Validar se o movimento é possível para uma Rainha.2. Verificar se a posição de destino não está ocupada por uma outra peça do próprio time.3. Depois, de acordo com o movimento feito pelo usuário, em “cruz” ou em “diagonal”, deve-

se verificar se o caminho não está bloqueado por alguma outra peça.4. O Rei não pode ficar em xeque.

Código:...

rules.add(new MovementRule());

rules.add(new SelfBlockedTargetRule());

int dx = movement.getSource().x-movement.getTarget().x;

int dy = movement.getSource().y-movement.getTarget().y;

if((dx==0)||(dy==0))

rules.add(new BlockedWayInCrossMoveRule());

else

rules.add(new BlockedWayInDiagonalMoveRule());

rules.add(new KingUnderAtackRule());

process(movement, rules); // executa a cadeia.

...

Page 11: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 171

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo:Já para a composição de regras do cavalo:1. Validar se o movimento é possível para um Cavalo.2. Verificar se a posição de destino não está ocupada por uma

outra peça do próprio time.3. O Rei não pode ficar em xeque.

Código:...

rules.add(new MovementRule());

rules.add(new SelfBlockedTargetRule());

rules.add(new KingUnderAtackRule());

process(movement, rules); // executa a cadeia.

...

Page 12: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 172

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo:

Conforme o a movimentação é criada uma cadeia de regras para validar um movimento pretendido pelo usuário. O movimento só será realizado se passar pela cadeia de regas, caso contrário, uma mensagem seráexibida ao usuário.

Page 13: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 173

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exemplo:Sistema que gerencia o encaminhamento de mensagens para destinatários.O sistema pergunta para cada “caixa postal” ou candidato a destinatário, se este é aquele que pode receber a mensagem. Caso positivo, a mensagem pode ser “recebida”; caso contrário, o sistema tenta o próximo candidato.

Page 14: BehavioralBehavioralPatterns–ChainofResponsabilityPatterns …professor.unisinos.br/ltonietto/jed/toe/DesignPatterns... · 2011. 4. 8. · Um jogo de xadrez (ou outro qualquer)

13-mai-09 Leandro Tonietto 174

Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability

Exercício:Classe que trata da validação de regras de negócio para permitir que uma determinada ação ou tarefa num sistema possa ser executada.Mais especificamente, fazer uma classe para validação para um cadastro de pessoas. Por exemplo, um cadastro lido do usuário só poderia ser aceito como um cadastro válido se:

Se os campos nome, CPF, RG e data nascimento foram informados.O nome possui no mínimo duas partículasSe o CPF é válidoSe a data informada é igual ou anterior a data atualSe o CPF é único no cadastro.

Caso a validação pare em alguma das regras retornar uma exceção informando qual regra foi “quebrada”.

Uma variante interessante é retornar todas as regras que foram “quebradas”.Caso a validação tenha sido vencida com sucesso, o objeto de Pessoa éadicionado na lista de pessoas.DICAS:

Para simular a lista de Pessoas utilize um array de pessoas (ArrayList no casoda programação em Java).Utilize exceções específicas para cada regra. Isto evita o uso de IFs