quinta-feira, 8 de maio de 2008

AULA 23 e 24 - PADRÃO COMMAND


Command é um dos 23 padrões de projeto do GOF e é um dos 11 padrões comportamentais


Encapsular uma solicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações, enfileirar ou fazer o registro (log) de solicitações e suportar operações que podem ser desfeitas.


Algumas vezes é necessário emitir solicitações para objetos nada sabendo sobre a operação que está sendo solicitada ou sobre o receptor da mesma.
Utilizar quando:
Parametrizar objetos por uma ação a ser executada. Você pode expressar tal parametrização numa linguagem procedural através de uma função callback, ou seja, uma função que é registrada em algum lugar para ser chamada em um momento mais adiante. Os Commands são uma substituição orientada a objetos para callbacks;
Especificar, enfileirar e executar solicitações em tempos diferentes. Um objeto Command pode ter um tempo de vida independente da solicitação original. Se o receptor de uma solicitação pode ser representado de uma maneira independente do espaço de endereçamento, então você pode transferir um objeto Command para a solicitação para um processo diferente e lá atender a solicitação;
Suportar desfazer operações. A operação Execute, de Command, pode armazenar estados para reverter seus efeitos no próprio comando. A interface do Command deve ter acrescentada uma operação Unexecute, que o reverte.efeitos de uma chamada anterior de Execute. Os comandos executados são armazenados em uma lista histórica. O nível ilimitado de desfazer e refazer operações é obtido percorrendo esta lista para trás e para frente, chamando operações Unexecute e Execute, respectivamente.


A chave deste padrão è uma classe abstrata Command, a qual declara uma interface para execução de operações. Na sua forma mais simples, esta interface inclui uma operação abstrata Execute. As subclasses concretas de Command especificam um par receptoração através do armazenamento do receptor como uma variável de instância e pela implementação de Execute para invocar a solicitação. O receptor tem o conhecimento necessário para poder executar a solicitação.


Também conhecido como Action, Transaction (Ação, Transação, respectivamente).
Obtido em http://pt.wikipedia.org/wiki/Command


EXEMPLO:


public class DvdName {


private String titleName;


public DvdName(String titleName) {


this.setTitleName(titleName);


}


public final void setTitleName(String titleNameIn) {


this.titleName = titleNameIn;


}


public final String getTitleName() {


return this.titleName;


}


public void setNameStarsOn() {


this.setTitleName(this.getTitleName().replace(' ','*'));


}


public void setNameStarsOff() {


this.setTitleName(this.getTitleName().replace('*',' '));


}


public String toString() {


return ("DVD: " + this.getTitleName());


}


}


public abstract class CommandAbstract {


public abstract void execute();


}


public class DvdCommandNameStarsOn extends CommandAbstract {


private DvdName dvdName;


public DvdCommandNameStarsOn(DvdName dvdNameIn) {


this.dvdName = dvdNameIn;


}


public void execute() {this.dvdName.setNameStarsOn();


}


}


public class DvdCommandNameStarsOff extends CommandAbstract {


private DvdName dvdName;


public DvdCommandNameStarsOff(DvdName dvdNameIn) {


this.dvdName = dvdNameIn;


}


public void execute() {


this.dvdName.setNameStarsOff();


}


}


class TestCommand {


public static void main(String[] args) {DvdName jayAndBob = new DvdName("Jay and Silent Bob Strike Back");


DvdName spongeBob = new DvdName("Sponge Bob Squarepants - " +"Nautical Nonsense and Sponge Buddies");


System.out.println("as first instantiated");


System.out.println(jayAndBob.toString());


System.out.println(spongeBob.toString());


CommandAbstract bobStarsOn = new DvdCommandNameStarsOn(jayAndBob);


CommandAbstract bobStarsOff = new DvdCommandNameStarsOff(jayAndBob);


CommandAbstract spongeStarsOn = new DvdCommandNameStarsOn(spongeBob);


CommandAbstract spongeStarsOff = new DvdCommandNameStarsOff(spongeBob);


bobStarsOn.execute();spongeStarsOn.execute();


System.out.println(" ");System.out.println("stars on");


System.out.println(jayAndBob.toString());


System.out.println(spongeBob.toString());


spongeStarsOff.execute();System.out.println(" ");


System.out.println("sponge stars off");


System.out.println(jayAndBob.toString());


System.out.println(spongeBob.toString());


}}


UML do Exempo:


Um comentário:

jbbf disse...

Bruno,
Gostei, principalmente por que está em dia. Diario é para estar em dia.
Sugiro nao colocar tanto techo de código, figuras e seus comentários ficam melhor.

Colocou link mas faltou mais bibliografia, padrao ABNT.

Nota 8,0