Padrão de Design – Design de Comando Padrão Simplificado

Existem muitos Comandos padrão de explicação lá fora, mas eu achei um pouco difícil de digerir ou compreender o exemplo fornecido nesses blogs/posts. Então, aqui vou tentar explicar da maneira que entendi.

para entender o padrão de comando vamos voltar para a década de 1990, quando tínhamos TVs enormes sem um remoto (pelo menos na Índia). Bons velhos tempos 😉

tivemos todos os botões para ligar/desligar, aumentar/diminuir os volumes.

tudo estava bem, funcionando bem, o único problema era se alguém queria ligar/desligar a TV ou reduzir / aumentar o volume, eles tinham que ir todo o caminho para a TV e usar o botão.

agora pense isso de uma maneira orientada a objetos. Uma TV é um objeto que tem um monte de operações/métodos/funções ou “Comando”. Estamos acessando diretamente o objeto de TV para invocar esses comandos.O problema desta abordagem?

  1. Você precisa o objeto para invocar um comando — e daí a pé todo o caminho para a TV
  2. Cada PLANO tem sua própria implementação de start/stop e não somos capazes de re-use o Comando “invocação”
  3. Se o outro dispositivo dizer “Set-Top Box” quer a mesma funcionalidade, nenhuma maneira de voltar a usar as mesmas operações — “Remoto Universal”

Como podemos resolver isso?

Imagine que a TV tem uma interface que implementa on / off e outras funcionalidades e expõe estes métodos / operações, dando a instância da interface a um “outro objeto”. Isso pode resolver o nosso problema. Vamos entrar em código:

Primeiro, vamos criar uma classe de TV, que tem as operações on/off.

IDevice.java
TV.java

da mesma forma, vamos criar uma classe Set-top box como estamos criando um remoto universal.

SetTopBox.java

agora que definimos os nossos dispositivos e as suas operações, precisamos de uma classe(comando) que possa manter os objectos da TV/SetTopBox e invocar estas operações.Vamos criar a nossa classe de comando. Como queremos realizar duas operações nesses dispositivos, a classe de comando “terá” um objeto de tipo IDevice. Precisamos de dois comandos ” ON “e”OFF”.
estes objetos de comando On / Off terão uma função/método de execução, que irá invocar a respectiva operação no dispositivo que tem.

se você notou, eu criei as aulas com o nome “OnCommad” e não “TVOnCommand”. A idéia é reutilizar a classe de comando para diferentes dispositivos. É o nosso comando universal, que suporta qualquer dispositivo.
isto nos permitirá criar um remoto universal. Bingo!!!!

até agora, temos abstraído as operações do dispositivo na forma de “comando”. A única coisa que nos resta é criar um controle remoto, para desencadear o “comando”.

Antes de criarmos o controlo remoto, precisamos de criar botões e cada botão irá executar o respectivo comando.

a classe RemoteButton tem um objeto de comando, que é executado quando o botão é pressionado.

RemoteButton.java

finalmente, vamos criar nosso dispositivo de controle remoto, que terá vários botões para cada operação.
quando estamos criando um dispositivo de controle remoto( usando o construtor), vamos instanciar todos os objetos e atribuir.

Controle Remoto.java

se você olhar para o código acima, nós definimos vários botões em nosso remoto e estamos tentando fazer Universal remote.

Estamos todos definidos para criar e jogar com o nosso RemoteControlDevice 🙂

Saída:

TV is on!
TV is off!
SetTopBox is on!
SetTopBox is off!Process finished with exit code 0

Como visto na saída de eu ter pressionado botões diferentes, para executar um conjunto de operações sobre os Dispositivos.Em resumo, a idéia é dar ao Cliente(Usuário psvm/TV) um controle remoto em vez de fazê-los andar todo o caminho para a TV ou dar TV para ligar/desligar TV 😀

conclusão

neste post, falamos sobre o padrão de design de comandos.
Em palavras simples:

A ideia é encapsular as operações em um objeto diferente(Comando) e re-utilizar e, em seguida, criar vários botões para executar estes objetos de comando, que tem operações de Dispositivo nela.

como de costume, você pode encontrar todo o código no meu GitHub.

You might also like

Deixe uma resposta

O seu endereço de email não será publicado.