PADRÃO COMMAND João Paulo Paschoal Arnaldo Correia Eric Carvalho DEFINIÇÃO "Encapsular uma requisição como um objeto, permitindo que clientes parametrizem diferentes requisições, filas ou requisições de log, e suportar operações reversíveis." [GoF] OBJETIVO • Encapsular solicitações em um objeto e utilizar suas ações sem conhecer sua implementação; • Possibilitar operações de fazer e desfazer; • Geração de logs; MOTIVAÇÃO • Algumas vezes é necessário solicitar uma operação sem nenhum conhecimento de como esta será implementada; • Podemos simplesmente não conhecer o objeto que vai receber a delegação para executar aquela operação; MOTIVAÇÃO • Imagine a situação de um item de menu: "colar" (Ctrl + V); o Ele não sabe a natureza da informação que está na Área de Transferência; o Pode ser uma Imagem, um Texto, etc. MOTIVAÇÃO • Solução: encapsular esta tarefa num objeto (um Command) e através dele delegar esta tarefa para outra classe, que por sua vez sabe como executar a operação propriamente dita (o Receiver); DIAGRAMA DE SEQUÊNCIA CONSEQUÊNCIAS • Promove o desacoplamento do objeto que solicita uma operação do objeto que vai realizar esta operação propriamente dita; • Solicitações em alto nível: o objeto não precisa ter nenhum conhecimento sobre a implementação da operação; CONSEQUÊNCIAS • Encapsulamento do Comando em um Objeto, podendo portanto serem manipulados e refinados como tal; DIAGRAMA DE CLASSE PARTICIPANTES • Command: Interface para execução de uma operação; • ConcreteCommand: Vincula um objeto Receiver a uma ação e implementa os métodos abstratos da classe Command; • Client: Cria um objeto ConcreteCommand e estabelece o seu Receiver; PARTICIPANTES • Invoker: Envia solicitações ao Command; • Receiver: Implementa as ações que serão utilizadas pelo ConcreteCommand; EXEMPLO REAL • Observe o exemplo real: • Trata-se de um “simulador” de carro de Formula 1; • Um Piloto pode executar as ações “acionarPedal” e “mudarMarcha”; • O Carro faz o papel do Invoker, gerenciando as ações do piloto; EXEMPLO REAL • Para as ações “acionarPedal” existem dois comandos: • AcelerarCommand, e • FreiarCommand; • Para as ações de “mudarMarcha” existem dois comandos: • SubirMarcha, e • DescerMarcha; EXEMPLO REAL EXEMPLO REAL • Piloto (Client) • EXEMPLO REAL • Carro (Invoker) EXEMPLO REAL • Carro (Invoker) continuação… EXEMPLO REAL • AcelerarCommand (Concrete Command) EXEMPLO REAL • DescerMarchaCommand (Concrete Command) EXEMPLO REAL • Rodas (Receiver) EXEMPLO REAL • Cambio (Receiver) EXEMPLO REAL • Main (Dentro de Piloto) EXEMPLO REAL • Saída do Main APLICAÇÕES • Realizar operações de fazer e desfazer; • Realizar operações de log; • Reduzir acoplamento entre requisição e execução de uma operação; • Projetar um sistema baseado em operações de alto nível, como operações de transações; PRÁTICA CALCULADORA Esta atividade simula uma calculadora com duas operações possíveis: Multiplicação ou MultiplicaçãoPorSoma . A calculadora envia comandos diferentes de acordo com a operação selecionada, encapsulando as solicitações como objeto. Com base no exemplo demonstrado, e nas classes parcialmente fornecidas, implemente o que falta para o funcionamento da calculadora.