|
|
(2 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| {{NAVPO}}
| | #REDIRECT [[ist:Comando (padrão de desenho)]] |
| <!--{{TOCright}}-->
| |
| O padrão comando permite encapsular um comando ou pedido num objecto. Assim, os clientes podem ser parametrizados com comandos variados e os comandos podem ser manipulados para atingir vários fins: é possível atrasar a sua execução, colocá-los em filas de espera e registar a sua execução. É ainda possível suportar a execução da inversão das acções das operações relativas a um comando (''undo'').
| |
| | |
| == Estrutura ==
| |
| | |
| ===Diagrama de classes===
| |
| | |
| O padrão comando tem a seguinte estrutura de classes:
| |
| | |
| [[Image:command-dpcd.png|600px]] | |
| | |
| ===Diagrama de sequência===
| |
| | |
| As colaborações entre os intervenientes são as que figuram no seguinte diagrama de sequência:
| |
| | |
| [[Image:command-dpsd.png|450px]]
| |
| | |
| == Exemplo ==
| |
| | |
| Considerando o código na biblioteca '''po-uilib''' (ver link abaixo), podem ser definidos comando como os seguintes.
| |
| | |
| Cada subclasse de '''Command''' deve providenciar o tipo do "receiver", assim como a instância (a superclasse -- '''Command''' -- apenas suporta um receptor de comandos, mas é possível definir outros que sejam necessários nas subclasses).
| |
| | |
| Exemplo de subclasse de '''Command''' (neste caso, apresenta-se, apenas a título de exemplo, uma operação fictícia sobre o tipo '''Cat''', suposto definido):
| |
| <java5>
| |
| public class ChaseLaserDot extends Command<Cat> {
| |
| public ChaseLaserDot(Cat receiver) {
| |
| super(MenuEntry.CHASE_LASER_DOT, receiver);
| |
| }
| |
| | |
| public final void execute() {
| |
| // DO SOMETHING
| |
| }
| |
| }
| |
| </java5>
| |
| | |
| Exemplo de definição de subclasse de '''Command''', fazendo uso da funcionalidade de validação dinâmica dos comandos (os comandos por omissão são sempre válidos -- ver código). Neste exemplo, assume-se que o método '''isReady''' está definido na classe '''Cat'''. O menu não apresentará o comando e não permitirá a sua invocação. No entanto, o método '''execute''' não é afectado (esta opção destina-se a simplificar as decisões, mas pode ter consequências imprevisíveis se um comando inválido for executado sem o teste ser efectuado).
| |
| <java5>
| |
| public class ChaseLaserDot extends Command<Cat> {
| |
| public ChaseLaserDot(Cat receiver) {
| |
| super(MenuEntry.CHASE_LASER_DOT, receiver, new ValidityPredicate<Cat>(receiver) {
| |
| public boolean isValid() {
| |
| return _receiver.isReady();
| |
| }
| |
| });
| |
| }
| |
| | |
| public final void execute() {
| |
| // DO SOMETHING
| |
| }
| |
| }
| |
| </java5>
| |
| | |
| A definição do método '''isValid''' é inteiramente dependente do domínio. Por omissão, o predicado é sempre verdadeiro.
| |
| | |
| == Exercícios ==
| |
| | |
| * [[Comando (padrão de desenho)/Banco, Conta, Titular (aplicação bancária)|Banco, Conta, Titular (aplicação bancária)]]
| |
| | |
| [[category:Ensino]]
| |
| [[category:PO]]
| |