Buscar

Uma das principais consequências positivas do padrão Command está na facilidade de adição de novas operações ao software. Por ele abstrair o concei...

Uma das principais consequências positivas do padrão Command está na facilidade de adição de novas operações ao software. Por ele abstrair o conceito de operação, isso permite que novas implementações possam ser facilmente incorporadas. Outro aspecto positivo do Command está no fato de ele ser uma representação de uma operação independente do contexto em que ela está inserida. Isso permite que essa operação seja armazenada em um histórico ou enviada pela rede, de forma que suas informações possam ser acessadas e a funcionalidade executada em qualquer momento. Isso é muito útil para a implementação de transações, registro de auditoria e até mesmo a funcionalidade de desfazer ações do usuário. Por outro lado, o fato de cada operação ser representada por uma classe diferente faz com que o número de classes cresça bastante. Um Command também acaba prejudicando o encapsulamento da classe relacionada com sua execução, pois ele precisa ter acesso às informações dela, que muitas vezes fariam sentido apenas internamente. Uma forma de contornar essa questão é utilizar Dependency Injection para injetar as informações nas classes que representam um comando. Uma alternativa para identificar qual parâmetro deve ser injetado poderia ser a utilização da injeção por interfaces, em que a presença de uma interface indicaria a necessidade de uma informação no comando. Implementando o Carrinho de Compras Para exemplificar a utilização do padrão Command, vamos pegar o exemplo do carrinho de compras utilizado na introdução dessa seção. O objetivo é permitir que o carrinho de compras possa ter diferentes operações de acordo com o contexto em que a aplicação tiver sido implantada. Isso irá permitir não somente que ele possa possuir diferentes operações em diferentes contextos, mas também que novas operações possam ser facilmente incorporadas. Para implementar o padrão Command nesse contexto, as operações do carrinho de compras devem ser representadas pelos comandos. A listagem a seguir apresenta a interface que deve ser implementada pelas classes que representam os comandos. Observe que o método executar() não recebe nenhum parâmetro, pois os parâmetros que essa execução tiver deverão ser inseridos na classe e armazenados como atributos. O retorno do tipo Object foi utilizado para possibilitar que o comando retorne qualquer objeto como resultado de sua execução, o qual deve ser tratado por quem invocá-lo. Listagem 8.1 - Interface que abstrai uma operação do carrinho de compras: public interface ComandoCarrinho{ public Object executar(); } A classe CarrinhoCompras, apresentada na listagem a seguir, é a classe que representa o carrinho de compras propriamente dito. Em sua estrutura de dados, além do usuário e da lista de produtos, também estão os comandos disponíveis para aquela instância. Os comandos são armazenados em um mapa e são identificados por uma String. Dentro desse contexto, o método executaComando() seria responsável por executá-lo e passar para ele as informações necessárias para sua execução. Caso o comando não seja encontrado no Map, uma exceção do tipo ComandoNaoEncontradoException é lançada pelo método. Listagem 8.2 - Implementação do Carrinho de Compras: public class CarrinhoCompras{ private Map comandos; private List produtos; private Usuario usuario; //outros métodos de carrinho de compras public Object executaComando(String nomeComando) throws ComandoNaoEncontradoException{ ComandoCarrinho c = comandos.get(nomeComando); if(c == null) throw new ComandoNaoEncontradoException(); if(c instanceof CienteDosProdutos){ (CienteDosProdutos(c)).setlistaProdutos(produtos); } if(c instanceof CienteDoUsuario){ (CienteDoUsuario(c)).setUsuario(usuario); } return c.executar(); } public Set getComandosDisponiveis(){ return comandos.keySet(); } } Uma característica interessante dessa solução é a utilização de interfaces para que o carrinho possa injetar as informações nos comandos. As interfaces CienteDosProdutos e CienteDoUsuario são implementadas pelas classes que desejam respectivamente receber a lista de produtos e as informações do usuário. Isso permite às classes sinalizarem de qual informação precisam para seu processamento e à classe CarrinhoCompras saber qual informação ela precisa passar.

Essa pergunta também está no material:

11 - Design Patterns Com Java
272 pág.

Português Escola Colegio Estadual Barao Do Rio BrancoEscola Colegio Estadual Barao Do Rio Branco

💡 1 Resposta

User badge image

Ed Verified user icon

Você tem que criar uma nova pergunta.

0
Dislike0

✏️ Responder

SetasNegritoItálicoSublinhadoTachadoCitaçãoCódigoLista numeradaLista com marcadoresSubscritoSobrescritoDiminuir recuoAumentar recuoCor da fonteCor de fundoAlinhamentoLimparInserir linkImagemFórmula

Para escrever sua resposta aqui, entre ou crie uma conta

User badge image

Outros materiais