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

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

Padrão Command Encapsulando a chamada de métodos com o padrão Command.

Apresentações semelhantes


Apresentação em tema: "Padrão Command Encapsulando a chamada de métodos com o padrão Command."— Transcrição da apresentação:

1 Padrão Command Encapsulando a chamada de métodos com o padrão Command.

2 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 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 Algumas classes que comandam os dispositivos já estão implementadas 1. We know that there are seven programmable slots for different devices…so each device may possibly adhere to some common interface. 2. We know that we need to turn each device “on” or “off”..so that needs to be commonly done for any device. 3. Undo needs to work for any device as well.

4 CD com classes implementadas

5 O que varia? O que permanece igual?
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 As classes dos dispositivos
As classes que nos foram providas: 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 Solução 1 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. if (slot1 instanceof Light) light.on(); else if (slot1 instanceof Hottub){ hottub.prepareJets(); hottub.jetsOn(); } else if (slot1 == TV) tv.on(); //etc

8 Responsabilidades As classes dos dispositivos As classes de Comando
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 A interface Command public interface Command { public void execute(); } A interface Command (neste exemplo) faz apenas uma coisa: executa um comando.

10 O que devemos fazer agora?
public interface Command { public void execute(); } O que devemos fazer agora?

11 LightOnCommand 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. LightOffCommand? Fácil fazer né... GarageDoorOpenCommand ? ... 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.

12 SimpleRemoteControl Esta versão do controle remoto tem apenas um slot.
public class SimpleRemoteControl { Command slot; public SimpleRemoteControl() {} public void setCommand(Command command) { slot = command; } public void buttonWasPressed() { slot.execute(); 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 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); Instanciando dois objetos – dispositivos. Instanciando dois comandos baseado nos dipositivos. Atribua os comandos e aperte o botão do controle.

14 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 Command Pattern - Diagrama de Classe
Client Invoker setCommand() <<Interface>> Command execute() undo() Receiver action() ConcreteCommand execute() undo()

16 Command Pattern – Diagrama de Classs para ControleRemoto
Controle remoto para automação de casas. RemoteControl RemoteControlTest <<Interface>> Command execute() undo() onCommands offCommands setCommand() onButtonPushed() offButtonPushed() Light LightOnCommand execute() undo() on() off() LightOffCommand execute() undo()

17 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 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. Há duas maneiras de fazer isto: Command (composto com TV e DVD) ou MacroCommand (composto por 2 Commands de ligar TV e ligar DVD).

19 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 Há semelhanças entre o padrão Command e os padrões Adapter, Façade e Strategy...
O que diferencia esses padrões? Interessante para simuladores – the sims, simcity...

21 Lab - Parte IV (Desafio!)
Para casa: como implementar o método undo() no controle remoto?

22 Referências [1] Capítulo 6 do livro “Padrões de Projeto – Use a Cabeça!”


Carregar ppt "Padrão Command Encapsulando a chamada de métodos com o padrão Command."

Apresentações semelhantes


Anúncios Google