Você está na página 1de 41

O padro Command

Motivao

Motivao

Motivao

Motivao

Motivao

Simplificando
Comando

solicita

Cliente

Receptor

Invocador

Simplificando
Comando

solicita

Receptor

Cliente

Invocador

Padro Comando
Participantes

Estrutura

Invocador
Comando
Receptor

Estrutura

Invocador
Comando
Receptor

Estrutura

Invocador
Comando
Receptor

Estrutura

Invocador
Comando
Receptor

Simplificando
Comando

solicita

Receptor

Cliente

Invocador

O Comando
Um conjunto de Aes no Receptor

1. O cliente cria um objeto do tipo Comando


)
(
o
d
n
a
m
o
C
solicita

2. O cliente executa um setComando() para


armazenar o objeto de comando no Invocador
)
(
o
d
n
a
m
o
C
solicita

3. O cliente pede ao invocador para


executar o comando
)
(
o
d
n
a
m
o
C
solicita

)
(
o
d
n
a
m
o
C
executar

4. O Invocador chama o mtodo


executar do Comando
)
(
o
d
n
a
m
o
C
solicita

)
(
o
d
n
a
m
o
C
executar

4. O Comando executa os mtodos


do Receptor
)
(
o
d
n
a
m
o
C
solicita

)
(
o
d
n
a
m
o
C
executar

Implementao

Vamos construir um controle remoto que


funcionar como um invocador
Ele acionar diversos mtodos de vrias
classes
Todas as classes que representaram comando
implementaro uma mesma interface

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

Digamos que exista


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

Vamos agorar implementar um


Comando para ligar a Lmpada(receptor)

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();
}
}

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();
}
}

()
o
d
n
a
m
o
C
o
criaObjet

)
(
o
d
n
a
m
o
C
executar

()
o
d
n
a
m
o
C
o
criaObjet

()
o
a
t
o
B
r
a
n
o
i
press

Crie um Comando para abrir o porto


de uma garagem

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

ComandoAbrirPortaoAutomatico.java
public class ComandoAbrirPortaoAutomatico implements Comando {
private PortaoAutomatico portao;
public ComandoAbrirPortaoAutomatico(PortaoAutomatico portao)
{
this.portao = portao;
}
public void executar() {
portao.abrir();
}
}

+1 Padro
COMMAND

O Padro Command encapsula uma


solicitao como um objeto, o que lhe
permite parametrizar clientes com diferentes
solicitaes, enfileirar ou registrar solicitaes
(log) e implementar recursos para desfazer
operaes.

Descrevendo

Um objeto Comando
Encapsula uma solicitao vinculando um conjunto
de aes em um receptor especfico
Empacota as aes e o objeto em um objeto que
expe um nico mtodo executar()
Ao executar() Aes so realizadas no receptor
No se sabe quais aes esto sendo realizadas

Padro Comando
Diagrama de classes

ControleRemoto.java

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;
}
}

H um problema

E quando no houver comandos?


Teremos que escrever?
if (comandosOn[slot] != null) {
comandosOn[slot].executar();
}
Criar um Comando que no faz nada

NoCommand
public class ComandoNenhum
implements Comando {
public void executar() {
}
}

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;
}
}

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();
}
}

Você também pode gostar