A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Padrões de Projeto Aula 15 – Padrão Command. PADRÃO COMMAND Encapsulando a chamada de métodos com o padrão Command. 2.

Apresentações semelhantes


Apresentação em tema: "Padrões de Projeto Aula 15 – Padrão Command. PADRÃO COMMAND Encapsulando a chamada de métodos com o padrão Command. 2."— Transcrição da apresentação:

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


Carregar ppt "Padrões de Projeto Aula 15 – Padrão Command. PADRÃO COMMAND Encapsulando a chamada de métodos com o padrão Command. 2."

Apresentações semelhantes


Anúncios Google