Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouEugénio Canedo Antunes Alterado mais de 8 anos atrás
1
Padrões de Projeto Aula 15 – Padrão Command
2
PADRÃO COMMAND Encapsulando a chamada de métodos com o padrão Command. 2
3
Descrição do problema - Motivação Automação domiciliar – Construa um controle remoto que controlará uma variedade de dispositivos de sua casa – Dispositivos exemplo: luz da sala, TV, ar condicionado, banheira, luz do jardim, ventilador de teto, portão da garagem, … 3
4
Controle Remoto Sete slots programáveis Podemos associar um dispositivo diferente para cada slot Cada slot possui botões de ligar e desligar Existe um botão global para “desfazer” uma ação Recebemos um CD com algumas classes implementadas que comandam os dispositivos 4
5
CD com classes implementadas 5
6
O que varia? O que permanece igual? O que varia: – O dispositivo atribuído em um dado slot – As instruções para ligar um dispositivo específico – As instruções para desligar um dispositivo específico O que permanece igual: – O controle remoto propriamente dito: Dispositivo com os sete slots Capacidade de mudar um slot Capacidade de ligar/desligar Capacidade de desfazer a última ação 6
7
As classes dos dispositivos As classes que nos foram providas (CD): – CelingLight (Luz) – TV – Hottube (Banheira) Toda classe precisa saber ligar e desligar, pois são essas as ações que o nosso controle remoto realizará. – Porém, cada classe do dispositivo (TV, banheira, etc) pode ter uma maneira única de ligar e desligar, até os nomes dos métodos podem ser diferentes 7
8
Solução 1 8 if (slot1 instanceof Light) light.on(); else if (slot1 instanceof Hottub){ hottub.prepareJets(); hottub.jetsOn(); } else if (slot1 == TV) tv.on(); //etc Problemas? Quebra de encapsulamento 1. O controle remoto tem que estar ciente dos detalhes para ligar/desligar algum dispositivo. Alto acoplamento 2. Se o algoritmo de ligar/desligar mudar o controle remoto deve mudar. Viola o princípio aberto- fechado 3. Se um novo dispositivo é adicionado, temos que mudar o código.
9
Responsabilidades As classes dos dispositivos – Definição dos métodos on/off As classes de Comando – Enviar as mensagens para os dispositivos (on/off) – Enviar mensagem para desfazer última tarefa (undo) O controle remoto lida com um ou mais comandos. O controle remoto não precisa saber detalhes das classes dos dispositivos que estão sendo usadas (nem como elas são implementadas). 9
10
A interface Command 10 public interface Command { public void execute(); } A interface Command (neste exemplo) faz apenas uma coisa: executa um comando.
11
11 public interface Command { public void execute(); } O que devemos fazer agora?
12
LightOnCommand 12 public class LightOnCommand implements Command { Light light; public LightOnCommand(Light light) { this.light = light; } public void execute() { light.on(); } Composição com a classe do dispositivo. Construtor recebe o objeto Light como parâmetro. Aqui o command delega a execução para classe do dispositivo (Light). Nota: este é um exemplo simples. Em outros casos pode ser preciso chamar mais métodos.
13
SimpleRemoteControl public class SimpleRemoteControl { Command slot; public SimpleRemoteControl() {} public void setCommand(Command command) { slot = command; } public void buttonWasPressed() { slot.execute(); } Esta versão do controle remoto tem apenas um slot. setCommand atribui um Command a um slot. Diga ao Command que execute! Note que qualquer command funcionaria aqui (polimorfismo). O controle remoto não sabe nada sobre o dispositivo sendo executado. 13
14
RemoteControlTest (main) SimpleRemoteControl remote = new SimpleRemoteControl(); Light light = new Light(); GarageDoor garageDoor = new GarageDoor(); LightOnCommand lightOn = new LightOnCommand(light); GarageDoorOpenCommand garageOpen = new GarageDoorOpenCommand(garageDoor); remote.setCommand(lightOn); remote.buttonWasPressed(); remote.setCommand(garageOpen); remote.buttonWasPressed(); Instanciando dois objetos – dispositivos. Instanciando dois comandos baseado nos dipositivos. Atribua os comandos e aperte o botão do controle. 14
15
Definição O padrão Command encapsula uma solicitação como um objeto, o que lhe permite parametrizar outros objetos com diferentes solicitações, enfileirar ou registrar solicitações e implementar recursos de cancelamento de operações. 15
16
Command Pattern - Diagrama de Classe ClientInvoker setCommand() > Command execute() undo() Receiver action() ConcreteCommand execute() undo() 16
17
Command Pattern – Diagrama de Classs para ControleRemoto RemoteControlTest RemoteControl onCommands offCommands setCommand() onButtonPushed() offButtonPushed() > Command execute() undo() Light on() off() LightOnCommand execute() undo() LightOffCommand execute() undo() Controle remoto para automação de casas. 17
18
Lab - Parte I Recebemos uma nova classe para o DVD. Para ligá-lo, chame o método turnPowerOn(). Para desligá-lo chame o método turnPowerOff(). Crie classes de Command para ligar e desligar o DVD player. 18
19
Lab - Parte II Suponha que você queira ser capaz de ligar/desligar o DVD e a TV ao mesmo tempo. Crie um Command que resolverá estes problemas com um único botão. 19
20
Lab - Parte III Note que as classes DvdOnCommand e DvdOffCommand têm código duplicado. Crie uma classe abstrata que ajude a remover esta duplicação. 20
21
Há semelhanças entre o padrão Command e os padrões Adapter, Façade e Strategy... – O que diferencia esses padrões? 21
22
Lab - Parte IV (Desafio!) Para casa: como implementar o método undo() no controle remoto? 22
23
Referências – [1] Capítulo 6 do livro “Padrões de Projeto – Use a Cabeça!” 23
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.