terça-feira, 9 de novembro de 2010

Command Pattern



Definição

O Command Pattern é usado para criar objetos que representam as ações e
eventos em um aplicativo. Um objeto de comnand encapsula uma ação ou evento e obtem todas as informações necessárias para entender exatamente o que aconteceu. Ao passar o objeto de command como um parâmetro que pode, em qualquer lugar necessário extrair informações sobre ações e eventos ocorridos.

Quando usar

• Se você quer uma ação que pode ser representada de várias formas, como menus  suspensos, botões e menus pop-up.
• Um objeto é um command de armazenamento possível para procedimento de parâmetros. Pode ser utilizado durante a montagem dos parâmetros para uma chamada de função e permite que o command seja reservado para uso posterior.
• Uma classe é um lugar adequado para coletar o código e os dados relacionados a um determinada ação ou evento.
• Permite a reação de um command a ser executado algum tempo depois de ter ocorrido.
• Os objetos Command permitem estruturas de dados contendo vários commands.
• Objetos de command suportam desfazer operações capazes, desde que os
objetos sejam armazenados (por exemplo, em uma lista ligada).

Desvantagens / consequências
 
Command desacopla o objeto que invca a operação daquele que sabe como executa-la.
Commands são objetos de primeira classe, ou seja, podem ser manipulados e estendidos como qualquer outro objeto.

Exemplo

package com.logica.command;
/** Command interface */

public interface Command{
void execute();
}

package com.logica.command;
/** The Command for turning on the light */

public class TurnOnLightCommand implements Command{
private Light theLight;

public TurnOnLightCommand(Light light){
this.theLight=light;
}




public void execute(){
theLight.turnOn();
}
}

package com.logica.command;
/** The Command for turning off the light */

public class TurnOffLightCommand implements Command{
private Light theLight;

public TurnOffLightCommand(Light light){
this.theLight=light;
}

public void execute(){
theLight.turnOff();
}
}

package com.logica.command;
/** Receiver class */

public class Light{
public Light(){ }

public void turnOn(){
System.out.println("The light is on");
}

public void turnOff(){
System.out.println("The light is off");
}
}

package com.logica.command;
/** Invoker class*/

public class Switch {
private Command flipUpCommand;
private Command flipDownCommand;

public Switch(Command flipUpCmd,Command flipDownCmd){
this.flipUpCommand=flipUpCmd;
this.flipDownCommand=flipDownCmd;
}




public void flipUp(){
flipUpCommand.execute();
}

public void flipDown(){
flipDownCommand.execute();
}
}

package com.logica.command;
/** Test class */

public class TestCommand{
public static void main(String[] args){
Light l = new Light();
Command switchUp      = new TurnOnLightCommand(l);
Command switchDown = new TurnOffLightCommand(l);
Switch s                        = new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();
}
}

Quando executado TestCommand o resultado é:
The light is on
The light is off

Nenhum comentário:

Postar um comentário