Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
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.
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.
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.
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.
13-mai-09 Leandro Tonietto 165
Behavioral Patterns – Chain of ResponsabilityBehavioralBehavioral PatternsPatterns –– ChainChain ofof ResponsabilityResponsability
Estrutura básica:
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.
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.
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.
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.
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.
...
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.
...
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.
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.
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