Command Pattern SISMO - Sistemas e Mobilidade http://www.sismo.deinf.ufma.br Departamento de Informática / UFMA Junho de 2008 Alexandre Vidal Padrões de Software O problema do controle remoto Programar um controle remoto com vários botões para ligar e desligar dispositivos Algumas funcionalidades serão incluı́das posteriormente Alexandre Vidal Padrões de Software Classes dos dispositivos acionáveis pelo CR Alexandre Vidal Padrões de Software Interface e Objetos Command Alexandre Vidal Padrões de Software Usando o objeto Command Alexandre Vidal Padrões de Software Testando o controle remoto Alexandre Vidal Padrões de Software O padrão Command (From:Head First Alexandre Vidal Padrões de Software O Padrão Command Classificação Propósito: Comportamental Escopo: Objetos Intenção Encapsular uma solicitação como um objeto, permitindo parametrizar clientes com diferentes solicitações, enfileirar ou fazer o registro de solicitações e suportar operações que podem ser desfeitas Alexandre Vidal Padrões de Software Aplicabilidade do Padrão Command Quando usar o Command Parametrizar objetos por uma ação a ser executada Especificar, enfileirar e executar solicitações em tempos diferentes Suportar operações undo (desfazer) Suportar registro (logging ) de mudanças que possam ser recuperadas Estruturar um sistema em torno de transações Alexandre Vidal Padrões de Software Estrutura Figura: Command - Estrutura Alexandre Vidal Padrões de Software Participantes Command Declara uma interface para a execução de uma operação ConcreteCommand Define uma vinculação entre um objeto Receiver e uma ação Implementa Execute() invocando operaçã(ões)o correspondente(s) nos Receivers Client Cria um objeto ConcreteCommand e estabelece o seu receptor Invoker Solicita ao Command a execução da solicitação Receiver Sabe como executar as operações associadas a uma solicitação Alexandre Vidal Padrões de Software Colaborações O cliente cria um objeto ConcreteCommand e especifica seu receptor Um objeto Invoker armazena o objeto ConcreteCommand O Invoker emite uma solicitação chamando Execute() no Command Quando os comandos podem ser desfeitos, ConcreteCommand armazena estados para desfazer o comando antes de invocar Execute() O objeto ConcreteCommand invoca operações no seu Receiver para executar a solicitação Alexandre Vidal Padrões de Software Interações entre objetos no Command Alexandre Vidal Padrões de Software Consequências Command desacopla o objeto que invoca a operação daquele que sabe como executá-la Commands são objetos de primeira classe (podem ser manipulados e estendidos como qualquer objeto) É possı́vel formar comandos compostos Para acrescentar novos Commands não precisa mudar classes existentes Alexandre Vidal Padrões de Software