padrões de projeto aula 10 – padrão façade. padrÃo faÇade padrões de projeto - façade por...
TRANSCRIPT
Padrões de ProjetoAula 10 – Padrão Façade
Padr
ões d
e Pr
ojet
o - F
açad
e
PADRÃO FAÇADE
Por que não tornar as coisas mais simples?
Alteração de uma interface com a intenção de simplificá-la. Oculta a complexidade de um conjunto de Classes.
Padr
ões d
e Pr
ojet
o - F
açad
e
Imagine um Home Theater
Padr
ões d
e Pr
ojet
o - F
açad
e
Imagine um Home Theater
1. Muitas classes2. Muitas interações3. Você precisa saber o funcionamento de tudo para saber usar corretamente
1. Quais métodos chamar para assistir um filme?
Padr
ões d
e Pr
ojet
o - F
açad
e
Para assistir um filme1. Ligar a máquina de pipoca2. Colocar a máquina de pipoca em funcionamento3. Reduzir as luzes4. Baixar a tela5. Ligar o projetor6. Configurar a entrada do projeto para DVD7. Colocar o projetor em modo wide-screen8. Ligar o amplificador de áudio9. Configurar a entrada do amplificador para DVD10. Configurar o amplificador para surround11. Ajustar o amplificador para o volume médio (5)12. Ligar o DVD Player13. Acionar o play no DVD Player
Padr
ões d
e Pr
ojet
o - F
açad
e
Para assistir um filme (em Java)1. pipoqueira.ligar();2. pipoqueira.cozinhar();3. luz.dim(10);4. tela.descer();5. projetor.ligar();6. projetor.setInput(dvdPlayer);7. projetor.modoWideSreen();
8. amplificador.ligar();9. amplificador.setDVD(dvdPlayer);10. amplificador.setSurroundAudio()
;11. amplificador.setVolume(5);
12. dvdPlayer.ligar();13. dvdPlayer.play(filme);
1. Ligar a máquina de pipoca2. Colocar a máquina de pipoca em
funcionamento3. Reduzir as luzes4. Baixar a tela5. Ligar o projetor6. Configurar a entrada do projeto para
DVD7. Colocar o projetor em modo wide-
screen8. Ligar o amplificador de áudio9. Configurar a entrada do amplificador
para DVD10. Configurar o amplificador para
surround11. Ajustar o amplificador para o volume
médio (5)12. Ligar o DVD Player13. Acionar o play no DVD Player
Padr
ões d
e Pr
ojet
o - F
açad
e
Ainda tem mais...• Neste tipo de situação ainda há uma ordem para fazer tudo• Ao final pode-se precisar fazer as ações em ordem inversa• E para ouvir um CD ou rádio?
• Se precisar atualizar o sistema terá que aprender um novo algoritmo
Padr
ões d
e Pr
ojet
o - F
açad
e
Solução para a complexidade• A FACHADA
+
Padr
ões d
e Pr
ojet
o - F
açad
e
A Fachada
• Uma classe que exponha somente alguns métodos simples:• assistirFilme()• pararFilme()
• Trata os componentes do Home Theater como um subsistema• Aciona as diversas partes necessárias para implementar o
método assistirFilme()
• O cliente assim pode usar os métodos da Fachada e não do subsistema
• Para assistir um filme basta acionar um método que se comunica com todo o subsistema
Padr
ões d
e Pr
ojet
o - F
açad
e
Solução: a Fachada
Padr
ões d
e Pr
ojet
o - F
açad
e
A Fachada• Preserva o acesso direto ao subsistema, mas...• Você ainda pode usar os métodos de cada aparelho
Padr
ões d
e Pr
ojet
o - F
açad
e
Implementando a Fachada
Padr
ões d
e Pr
ojet
o - F
açad
e
Implementando a Fachada
Padr
ões d
e Pr
ojet
o - F
açad
e
Como a vovó assistiria o filme
Padr
ões d
e Pr
ojet
o - F
açad
e
Questões sobre a Fachada• Encapsula as classes do subsistema?• Não. Apenas fornecem uma interface simplificada para acessar suas
funcionalidades. Mas, o cliente ainda pode acessar as funcionalidades do subsistema diretamente (por isso dizemos que o subsistema não é encapsulado);
• Acrescenta funcionalidade?• Nada impede que uma fachada incorpore sua “própria inteligência” além de
utilizar o subsistema;• Cada subsistema possui somente um fachada?• Não necessariamente. Ele pode ter quantas julgar necessário;
• Qual o benefício da fachada além de fornecer uma interface simples?• Baixo acoplamento. Suponha que você trocou o seu Home Theater todo,
comprando novos componentes com interfaces diferentes... Se o cliente estiver codificado acessando a fachada, ele não precisará ser alterado, apenas a fachada;
• Qual a diferença da Fachada para o Adapter?• O objetivo da fachada é simplificar o acesso, e o do adapter é alterar as interfaces
para tornar possível o acesso.
Padr
ões d
e Pr
ojet
o - F
açad
e
Resumindo• As Fachadas, além de simplificar uma interface• Desconecta o cliente de um subsistema de componentes
• Uma Fachada simplifica e um Adapter converte uma interface para algo diferente
Padr
ões d
e Pr
ojet
o - F
açad
e
Definição
O padrão Façade fornece uma interface unificada e simplificada para um conjunto de
interfaces em um subsistema. O Façade define uma interface de nível mais alto que facilita a
utilização do subsistema.
Padr
ões d
e Pr
ojet
o - F
açad
e
Terminologia e Estrutura
Padr
ões d
e Pr
ojet
o - F
açad
e
Participantes• Fachada• Conhece quais as classes do subsistema são responsáveis pelo
atendimento de uma solicitação• Classes de Subsistema• Implementam a funcionalidade do subsistema • Encarregam-se do trabalho atribuído a elas pelo objeto Fachada• Não têm conhecimento da Fachada, ou seja, não possuem
referência para a mesma
Padr
ões d
e Pr
ojet
o - F
açad
e
Colaborações• Os clientes se comunicam com um subsistema através do
envio de solicitações para a Fachada, a qual repassa para os objetos apropriados do subsistema. Embora os objetos do subsistema executem o trabalho real, a fachada pode ter que efetuar trabalho próprio dela para traduzir a sua interface para as interfaces do subsistema;
• Os clientes que usam a fachada não têm que acessar os objetos do subsistema diretamente.
Padr
ões d
e Pr
ojet
o - F
açad
e
public class Cpu{ public void start(){
System.out.println("inicialização inicial");} public void execute(){
System.out.println("executa algo no processador"); } public void load() {
System.out.println("carrega registrador"); } public void free() {
System.out.println("libera registradores"); }
}
• Considere as seguintes entidades/classes que compõem um computador: CPU, Memory, HardDrive.
public class Memory { public void load() {
System.out.println("carregando dados na memória"); } public void free() {
System.out.println("liberando dados da memória"); }
}
Exercício
Padr
ões d
e Pr
ojet
o - F
açad
e
Exercíciopublic class HardDrive { public void read() { System.out.println("lendo dados do HD"); } public void write() { System.out.println("escrevendo dados no HD"); } }
• Crie uma fachada que facilite ligar o computador.• Para ligar o computador, você deve seguir a seguinte ordem:
1. Inicializar a CPU2. Ler do disco rígido3. Carregar uma informação da memória4. Executar a CPU5. Liberar memória
Padr
ões d
e Pr
ojet
o - F
açad
e
Referências• [1] Capítulo 7 do livro “Padrões de Projeto – Use a Cabeça!”