Exemplo do Padrão de Projeto ‘Comando’: Controle Remoto
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