BehavioralBehavioralPatterns-CommandPatterns...
Transcript of BehavioralBehavioralPatterns-CommandPatterns...
4-jun-09 Leandro Tonietto 175
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Encapsula uma requisição como um objeto.Um comando como um objeto.
Situação onde é necessário emitir requisição e não se tem conhecimento sobre o que exatamente será feito ou o receptor não desconhece de ante-mão o que é a requisição. Ele apenas atende ou executa.Outro ponto interessante é o reuso de uma operação. Digamos que uma operação ou comando possa ser executado por caminhos diferentes (a ação final é a mesma). Associando a operação a um objeto, este objeto pode ser invocado de diversas maneiras.
4-jun-09 Leandro Tonietto 176
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exemplo em [1]:Toolkit de interface com gerenciamento de menu.O toolkit tem a responsabilidade em conhecer as funcionalidades do menu apenas. Como: mostrar lista de opções, associar itens aos menus e acionar algum comando quando menu for executado.A aplicação que usará o menu sabe quais ações serão executadas e por quem.O pattern command cabe nesta situação. A ação que deverá ser executada é colocada numa classe, cujo o objeto é associado com um item de menu (MenuItem).Quando o item de menu for acionado, ele invoca um método padrão do objeto de ação, que executará determina ação. Separa o objeto que invoca a ação do objeto que executa a ação.
4-jun-09 Leandro Tonietto 177
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exemplo em [1]:
4-jun-09 Leandro Tonietto 178
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exemplo em [1]:
4-jun-09 Leandro Tonietto 179
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Estrutura básica [1]:
4-jun-09 Leandro Tonietto 180
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Aplicação [1]:Objeto deve especificar uma ação que será realizada quando invocado por outro. Este objeto serve de parâmetro para o remetente da ação.
Similar a uma função callback.
Execução em tempo independente da invocação. Suporte a undo. A operação “execute” disparar a ação de cópia de um objeto e depois disparar a ação de reverter o estado do mesmo, invocando outra ação.Recuperação de log. O command é executado quando alguma ação é feita para registrar ação no log.Execução de ações por mais de uma forma de acionamento.Suporte a operações alto-nível, construídas através de operações primitivas. Controle de transação, por exemplo.
4-jun-09 Leandro Tonietto 181
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Conseqüências:Desacomplamento, quem invoca um comando não precisa conhecer a ação resultante.
No caso do menu, os objetos da classe de Menu (framework) não tem qualquer conhecimento prévio sobre quais ações devem executar. Quem decide isso é a aplicação, que cria um objeto command para encapsular a ação.
Independência, os commands evoluem livremente. Além disso, adicionar novos comandos não implica em alterar as classes existentes.É possível implementar o command com composite de forma a executar ações em cascata.
Assim como comandos que podem disparar outros em cascata. Por exemplo, o comando gravar pode disparar e-mail para um administrador do sistema. O envio de e-mail aciona gravação num log.
4-jun-09 Leandro Tonietto 182
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Implementação:O command deve implementar uma interface conhecida tanto pela aplicação quando pelo sender.
Esta é a forma de ligação entre aplicação (client) e framework.
Para suporte a undo e redo, é necessário criar uma operação para desfazer (execute) e outra para refazer (unexecute). Além disso, a aplicação deve manter uma lista de estados do objeto, caso queira permitir histórico de ações.O uso de templates C++ (ou Java) podem flexibilizar o uso da classe Command. Ver exemplo de código no livro [1].
4-jun-09 Leandro Tonietto 183
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exemplo:Framework undo e redo.Quando o usuário da aplicação solicita a ação undo, o framework, desfaz a última ação e invoca o objeto que deve dá algum tratamento para estado desfeito do objeto.
Alguma ação deve ser feita pela aplicação quando o undo foi acionado. Exemplo: voltar a imagem ao estado anterior.
Esta comunicação é feita através eventos, funcionalidade equivalente a invocação do command.
4-jun-09 Leandro Tonietto 184
Application tier
Framework tier
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exemplo:
Undo e Redo
Stream Manager
GUI Component
Client application
Quando uma ação édesfeita, um evento
notifica a aplicação que ela deve reagir a esta
ação.
4-jun-09 Leandro Tonietto 185
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exercício 1:A tarefa é fazer algum jogo que tenha coleta de recursos, tal como: RTS, FTS e etc.A cada item coletado, o jogo deve executar um comportamento apropriado para o item. Por exemplo, num FPS, se o jogador coletou um “pack de vida”, o estado do jogo muda; ele poderia: além de recebe mais energia, melhorar a visão do player, melhor a sua movimentação ou habilitar movimentos até então não disponíveis. Outro exemplo, neste mesmo FPS, a coleta de algum elemento de acesso a outros níveis (como chaves especiais), desencadeia uma mudança no cenário do jogo, as porta que obedecem aquela chave fica abertas a partir de então.Como seria o diagrama de classes, no que tange ao padrão command, para contemplar esta situação?
4-jun-09 Leandro Tonietto 186
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exercício 2:Projetar e implementar um framework de undo e redo.O framework deve manter uma lista de estados de objetos modificados. Quando solicitado undo, por exemplo, o framework deve retornar ao estado anterior do objeto e, de alguma maneira,repassar isto para a aplicação tomar alguma ação considerando o novo estado do objeto; o mesmo vale para a ação redo.Por fim, torne o framework genérico a tal ponto que se possa retornar o estado anterior de qualquer tipo de objeto.Exemplos de aplicação para o framework:
Editor de texto, pode realizar as ações para edição de texto, como para formatação ou inserção / manipulação de objetos gráficos.Um jogo pode permitir que o usuário siga um caminho e possa voltar (desfazer) o caminho seguido.
4-jun-09 Leandro Tonietto 187
Behavioral Patterns - CommandBehavioralBehavioral PatternsPatterns -- CommandCommand
Exercício 3:No projeto em que você está trabalhando para a disciplina, certamente, é possível encaixar o padrão command no projeto. Identifique as possibilidades e o utilize aonde for mais adequado.