behavioralbehavioralpatterns-commandpatterns...

13
4-jun-09 Leandro Tonietto 175 Behavioral Patterns - Command Behavioral Behavioral Patterns Patterns - - Command Command 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.

Upload: builiem

Post on 09-Feb-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

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.