padrão command

41
O padrão Command

Upload: eduardo-mendes-de-oliveira

Post on 26-Jun-2015

695 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Padrão Command

O padrão Command

Page 2: Padrão Command

Motivação

Page 3: Padrão Command

Motivação

Page 4: Padrão Command

Motivação

Page 5: Padrão Command

Motivação

Page 6: Padrão Command

Motivação

Page 7: Padrão Command

Simplificando Comando

Receptor

Invocador

Cliente

solicita

Page 8: Padrão Command

Invocador

Simplificando Comando

Receptor Cliente

solicita

Page 9: Padrão Command

Padrão Comando Participantes

Page 10: Padrão Command

Estrutura

Receptor

Comando

Invocador

Page 11: Padrão Command

Estrutura

Receptor

Comando

Invocador

Page 12: Padrão Command

Estrutura

Receptor

Comando

Invocador

Page 13: Padrão Command

Estrutura

Receptor

Comando

Invocador

Page 14: Padrão Command

Invocador

Simplificando Comando

Receptor Cliente

solicita

Page 15: Padrão Command

O Comando Um conjunto de Ações no Receptor

Page 16: Padrão Command

1. O cliente cria um objeto do tipo Comando

solicitaComando()

Page 17: Padrão Command

2. O cliente executa um setComando() para armazenar o objeto de comando no Invocador

solicitaComando()

Page 18: Padrão Command

3. O cliente pede ao invocador para executar o comando

solicitaComando()

executarComando()

Page 19: Padrão Command

4. O Invocador chama o método executar do Comando

solicitaComando()

executarComando()

Page 20: Padrão Command

4. O Comando executa os métodos do Receptor

solicitaComando()

executarComando()

Page 21: Padrão Command

Implementação   Vamos construir um controle remoto que

funcionará como um invocador   Ele acionará diversos métodos de várias

classes   Todas as classes que representaram comando

implementarão uma mesma interface

Page 22: Padrão Command

Interface Comando public interface Comando { public void executar(); }

Page 23: Padrão Command

Digamos que exista um objeto Lâmpada (receptor)

public class Lampada { public void ligar() { System.out.println("Luz ligada"); } public void desligar() { System.out.println("Luz desligada"); } }

Page 24: Padrão Command

Vamos agorar implementar um Comando para ligar a Lâmpada(receptor)

Page 25: Padrão Command

O Controle Remoto (invocador)

public class ControleRemotoSimples { private Comando slot; public ControleRemotoSimples() { } public void setComando(Comando comando) { this.slot = comando; } public void pressionarBotao() { slot.executar(); } }

Page 26: Padrão Command

Testando o Controle public class TesteDoControleRemoto { public static void main(String[] args) { ControleRemotoSimples controle = new ControleRemotoSimples(); Lampada lampada = new Lampada(); ComandoLuzLigada ligarLuz = new ComandoLuzLigada(lampada); controle.setComando(ligarLuz); controle.pressionarBotao(); } }

Page 27: Padrão Command

criaObjetoComando()

executarComando()

Page 28: Padrão Command

criaObjetoComando()

pressionarBotao()

Page 29: Padrão Command

Crie um Comando para abrir o portão de uma garagem

Page 30: Padrão Command

PortaoAutomatico.java public class PortaoAutomatico { public void abrir() { System.out.println("Portao abrindo"); } public void fechar() { System.out.println("Portao fechando");

} }

Page 31: Padrão Command

ComandoAbrirPortaoAutomatico.java public class ComandoAbrirPortaoAutomatico implements Comando { private PortaoAutomatico portao; public ComandoAbrirPortaoAutomatico(PortaoAutomatico portao)

{ this.portao = portao; } public void executar() { portao.abrir(); } }

Page 32: Padrão Command

+1 Padrão COMMAND

O Padrão Command encapsula uma solicitação como um objeto, o que lhe permite parametrizar clientes com diferentes solicitações, enfileirar ou registrar solicitações (log) e implementar recursos para desfazer operações.

Page 33: Padrão Command

Descrevendo   Um objeto Comando

  Encapsula uma solicitação vinculando um conjunto de ações em um receptor específico

  Empacota as ações e o objeto em um objeto que expõe um único método executar()

  Ao executar() Ações são realizadas no receptor   Não se sabe quais ações estão sendo realizadas

Page 34: Padrão Command

Padrão Comando Diagrama de classes

Page 35: Padrão Command
Page 36: Padrão Command

ControleRemoto.java

Page 37: Padrão Command

ControleRemoto.java public class ControleRemoto { Comando[] comandosOn; Comando[] comandosOff; public ControleRemoto() { } public void pressionarBotaoOn(int slot) { comandosOn[slot].executar(); } public void pressionarBotaoOff(int slot) { comandosOff[slot].executar(); } public void setCommand(int slot, Comando on, Comando off) { comandosOn[slot] = on; comandosOff[slot] = off; } }

Page 38: Padrão Command

Há um problema   E quando não houver comandos?   Teremos que escrever?

if (comandosOn[slot] != null) { comandosOn[slot].executar(); } Criar um Comando que não faz nada

Page 39: Padrão Command

NoCommand public class ComandoNenhum implements Comando {

public void executar() {

} }

Page 40: Padrão Command

O Construtor do ControleRemoto public ControleRemoto() { comandosOn = new Comando[7]; comandosOff = new Comando[7]; Comando semComando = new ComandoNenhum(); for (int i = 0; i < 7; i++) { comandosOn[i] = semComando; comandosOff[i] = semComando; } }

Page 41: Padrão Command

Com undo public class ComandoLuzLigada implements Comando { private Lampada luz; public ComandoLuzLigada(Lampada luz) { this.luz = luz; } public void executar() { luz.ligar(); } public void undo() { luz.desligar(); } }