Exemplo do Padrão de Projeto ‘Comando’: Controle Remoto

3 minutos de leitura

Atualizado em:

Olá galera!

Estudando um pouco mais sobre padrões de projeto, estava lendo sobre o padrão Command (Comando), no livro Use a Cabeça - Padrões de Projeto, muito bom por sinal, uma ótima fonte para que conhece pouco ou nada sobre o assunto.

Este post nada mais é do que os exemplos do livro, com algumas incrementadas feitas por mim, como uma simples interface gráfica.

O que são os Padrões de Projetos (ou Design Pattern)?

Um Padrão de Projeto, descreve uma solução geral reutilizável para um problema recorrente no desenvolvimento de sistemas de software orientados a objetos. Não é um código final, é uma descrição ou modelo de como resolver o problema do qual trata, que pode ser usada em muitas situações diferentes. Os Padrões de Projeto normalmente definem as relações e interações entre as classes ou objetos, sem especificar os detalhes das classes ou objetos envolvidos, ou seja, estão num nível de generalidade mais alto.

O padrão Command

Segundo Freeman, no livro citado acima, o padrão command encapsula uma solicitação como um objeto, permitindo que você parametrize clientes com diferentes solicitações e implemente operações reversíveis.

Ou seja, você leva a orientação a objetos a um outro nível, encapsulando implementações de classes, em que você não saiba como foram implementadas, ou não precisa saber.

Exemplo

O exemplo apresentado no livro, propõe a construção de um software, que gerencia um Controle Remoto para automação residencial, o controle é um dispositivo com 7 slots (cada slot representa um aparelho) com um botão de ligar, e outro de desligar associado a cada slot, além de um botão de desfazer a última ação, mais ou menos como a imagem abaixo:

Baixe o código completo aqui

Temos várias classes que representam objetos da casa, como uma lâmpada:

public class Light {

Status s = Status.getInstance();

public void on(){
s.addMensagem("Luz acesa");
}

public void off(){
s.addMensagem("Luz apagada");
}

}

Foi proposta a criação de uma interface:

public interface Command {
public void execute();
public void undo();
}

E de uma classe para cada comando:

public class LightOnComand implements Command{

Light light;

public LightOnComand(Light light){
this.light=light;
}

@Override
public void execute() {
light.on();
}

@Override
public void undo() {
light.off();
}

}

E de uma classe RemoteControl, que gerencia os slots e as ações dos botões:

/**
* @author Paulo Collares
* www.paulocollares.com.br
*/
public class RemoteControl {

Command[] onCommands;
Command[] offCommands;
Command undoCommand;
String[] nomes;

public RemoteControl(){

onCommands = new Command[7];
offCommands = new Command[7];
nomes = new String[7];

Command noCommand = new NoCommand();

for (int i = 0; i < 7; i++) {
onCommands[i]=noCommand;
offCommands[i]=noCommand;
}
undoCommand=noCommand;
}

public void setCommand(int slot, Command onCommand, Command offCommand, String nome){
onCommands[slot]=onCommand;
offCommands[slot]=offCommand;
nomes[slot]=nome;
}

public void onButtonWasPushed(int slot){
onCommands[slot].execute();
undoCommand=onCommands[slot];
}

public void offButtonWasPushed(int slot){
offCommands[slot].execute();
undoCommand=offCommands[slot];
}

public void undoButtonWasPushed(){
undoCommand.undo();
}

public Command getCommand(int slot){
return onCommands[slot];
}

public String getNome(int slot){
return nomes[slot];
}
}

Na aplicação então, instanciamos a classe RemoteControl e Light

RemoteControl remote = new RemoteControl();

Light light = new Light();

E o comando para ligar a luz, por exemplo:

LightOnComand lightOn = new LightOnComand(light);

Alocamos este comando em um slot do nosso controle remoto:

remote.setCommand(0, lightOn, lightOff, "Luz");

e chamamos o comando:

remote.onButtonWasPushed(0);

Baixe o código completo aqui

Este é um exemplo simples, mas que serve bem para entendermos o funcionamento do padrão.

Além do Padrão Command, utilizo também o Singleton, que força uma classe ter apenas uma instancia na aplicação, que neste caso é a janela de status.

Na aplicação há dois slots vazios, tente criar mais dois objetos e adiciona-los ao controle remoto!

Deixem seus comentários!

Até a próxima!

Fontes:

Padrões de Projeto - Coleção Use a Cabeça! 2° Edição - Eric Freeman e Elisabeth Freeman

http://pt.wikipedia.org/wiki/Padr%C3%A3o_de_projeto_de_software

Deixe um comentário