SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
PADRÃO FACHADA
Fachada
  Alteração de um interface com a intenção de
simplificá-la
  Oculta a complexidade de um conjunto de
classes
Imagine um HomeTheater
HomeTheater
  Muitas classes
  Muitas interações
  Você precisa saber o
funcionamento de tudo
para saber usar
corretamente
Para assistir um filme
1.  Ligar a máquina de pipoca
2.  Colocar a máquina de pipoca em funcionamento
3.  Reduzir as luzes
4.  Baixar a tela
5.  Ligar o projetor
6.  Congurar a entrada do projeto para DVD
7.  Colocar o projetor em modo wide-screen
8.  Ligar o amplicador de áudio
9.  Congurar a entrada do amplicador para DVD
10.  Congurar o amplicador para surround
11.  Ajustar o amplicador para o volume médio (5)
12.  Ligar o DVD Player
13.  Acionar o play no DVD Player
Para assistir um filme
Em Java
1.  Ligar a máquina de pipoca
2.  Colocar a máquina de pipoca em
funcionamento
3.  Reduzir as luzes
4.  Baixar a tela
5.  Ligar o projetor
6.  Configurar a entrada do projeto para DVD
7.  Colocar o projetor em modo wide-screen
8.  Ligar o amplificador de áudio
9.  Configurar o amplificador para DVD
10.  Configurar o amplificador para surround
11.  Ajustar o amplificador para o volume médio
12.  Ligar o DVD Player
13.  Acionar o play no DVD Player
pipoqueira.ligar();
pipoqueira.cozinhar();
luz.dim(10);
tela.descer();
projetor.ligar();
projetor.setInput(dvdPlayer);
projetor.modoWideSreen();
amplificador.ligar();
amplificador.setDVD(dvdPlayer);
amplificador.setSurroundAudio();
amplificador.setVolume(5);
dvdPlayer.ligar();
dvdPlayer.play(filme);
+ Problemas
  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
Solução para a complexidade
  A FACHADA
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()
A Fachada
  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
Solução para a complexidade
  A FACHADA
A Fachada
  Preserva o acesso direto ao subsistema
  Você ainda pode usar os métodos de cada
aparelho
Implementando a Fachada
public class HomeTheaterFacade {
Amplificador amplificador;
Sintonizador sintonizador;
CDPlayer cdPlayer;
DVDPlayer dvdPlayer;
Projetor projetor;
LuzAmbiente luz;
Tela tela;
Pipoqueira pipoqueira;
/**
* Construtor
*/
public HomeTheaterFacade(
Amplificador amplificador,
Sintonizador sintonizador,
CDPlayer cdPlayer,
DVDPlayer dvdPlayer,
Projetor projetor,
LuzAmbiente luz,
Tela tela,
Pipoqueira pipoqueira) {
this.amplificador = amplificador;
this.sintonizador = sintonizador;
this.cdPlayer = cdPlayer;
this.dvdPlayer = dvdPlayer;
this.projetor = projetor;
this.luz = luz;
this.tela = tela;
this.pipoqueira = pipoqueira;
}
Implementando a Fachada
/**
* Método que simplifica o uso de vários objetos
* @param filme
*/
public void assistirFilme(Filme filme) {
System.out.println(
"Tudo ok para assistir um filme!");
pipoqueira.ligar();
pipoqueira.cozinhar();
luz.dim(10);
tela.descer();
projetor.ligar();
projetor.setInput(dvdPlayer);
projetor.modoWideSreen();
amplificador.ligar();
amplificador.setDVD(dvdPlayer);
amplificador.setSurroundAudio();
amplificador.setVolume(5);
dvdPlayer.ligar();
dvdPlayer.play(filme);
}
/**
* Outro método que simplifica
* um conjunto de tarefas
*/
public void pararFilme(){
System.out.println("Desligando o
home...");
pipoqueira.desligar();
luz.ligar();
tela.subir();
projetor.desligar();
amplificador.desligar();
dvdPlayer.parar();
dvdPlayer.eject();
dvdPlayer.desligar();
}
Fachada
Para assistir um filme
de maneira simplificada
public class TesteHomeTheater {
public static void main(String[] args) {
//Criação das instâncias dos componentes
HomeTheaterFacade ht =
new HomeTheaterFacade(amplificador,
sintonizador, cdPlayer,dvdPlayer, projetor,
luz, tela, pipoqueira);
ht.assistirFilme(filme);
ht.pararFilme();
}
}
Questões sobre a fachada
  Encapsula as classes do sistema?
  Acrescenta funcionalidade?
  Cada subsistema possui somente um fachada?
  Qual o benefício da fachada além de fornecer
uma interface simples?
  Qual a diferença da Fachada para o
Adaptador?
Um pouco mais
  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
+1 Padrão
FACADE
O Padrão Facade fornece uma interface
unificada para um conjunto de interfaces em
um subsistema. A Fachada define uma
interface de nível mais alto que facilita a
utilização de um subsistema.
Diagrama de classes
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
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
Princípio de Design
  “Princípio do Mínimo Conhecimento – só
interaja com seus amigos mais próximos.”
  Ter cuidado com o número de classes com que
qualquer objeto interage e também com a forma
como essa interação ocorre
  Minimizar o acoplamento entre classes
  Evita um efeito em cascata quando houver alterações
em um sistema
Princípio de Design
  Mínimo Conhecimento (Lei de Demétrio)
  Em um determinado objeto, a partir de qualquer
método do mesmo, só podemos invocar métodos
que pertençam:
  Ao próprio objeto
  A objetos que tenham sido passados como parâmetros
para o método
  A qualquer objeto que seja criado ou instanciado pelo
método
  A qualquer componente do objeto
Princípio de Design
  SEM o uso do princípio
public float getTemperatura() {
Termometro t = estacao.getTermometro();
return t.getTemperatura();
}
Princípio de Design
  COM o uso do princípio
public float getTemperatura() {
return estacao.getTemperatura();
}
Princípio de Design
  Uma classe em conformidade com o princípio
public class Carro {
Motor motor;
public Carro() {
}
public void ligar(Chave chave) {
Portas portas = new Portas();
boolean autorizado = chave.virar();
motor.ligar();
atualizarVisorDoCarro();
portas.trancar();
}
private void atualizarVisorDoCarro() {
// TODO Auto-generated method stub
}
}
Princípio de Design
  Desvantagens
  Maior número de classes que envolvem outras
classes, isto pode gerar:
  Aumento de complexidade
  Aumento no tempo de desenvolvimento de software
  Redução de desempenho
Princípio de Design
X Fachada

Mais conteúdo relacionado

Destaque

Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projetoejdn1
 
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010Flávio Lisboa
 
Padrão de Projetos singleton
Padrão de Projetos singletonPadrão de Projetos singleton
Padrão de Projetos singletonWendel Moreira
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareCarlos Santana
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebEr Galvão Abbott
 
Introducao - Engenharia de Software
Introducao - Engenharia de SoftwareIntroducao - Engenharia de Software
Introducao - Engenharia de SoftwareEduardo Mendes
 
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetG gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetMessias Castro
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de djangoFilipe Ximenes
 
Padrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - FacadePadrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - FacadeEduardo Nicola F. Zagari
 
Evolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEvolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEduardo Mendes
 
Padrões-02 - Padrões Arquiteturais - Camadas
Padrões-02 - Padrões Arquiteturais - CamadasPadrões-02 - Padrões Arquiteturais - Camadas
Padrões-02 - Padrões Arquiteturais - CamadasEduardo Nicola F. Zagari
 
Desenvolvimento agil de_software
Desenvolvimento agil de_softwareDesenvolvimento agil de_software
Desenvolvimento agil de_softwareEduardo Mendes
 
Fábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoFábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoEduardo Mendes
 

Destaque (20)

Desenho arquitetônico
  Desenho arquitetônico  Desenho arquitetônico
Desenho arquitetônico
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
 
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
Padrões de Projeto e Boas Práticas em PHP - PHP Conference Brasil 2010
 
Padrão de Projetos singleton
Padrão de Projetos singletonPadrão de Projetos singleton
Padrão de Projetos singleton
 
Boas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de softwareBoas práticas no desenvolvimento de software
Boas práticas no desenvolvimento de software
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
 
Introducao - Engenharia de Software
Introducao - Engenharia de SoftwareIntroducao - Engenharia de Software
Introducao - Engenharia de Software
 
Html - Aula 3
Html - Aula 3Html - Aula 3
Html - Aula 3
 
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetG gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
 
# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de django
 
Padrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - FacadePadrões-12 - Padrões Estruturais - Facade
Padrões-12 - Padrões Estruturais - Facade
 
Evolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEvolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de Software
 
Apostila `profissional cftv
Apostila `profissional cftvApostila `profissional cftv
Apostila `profissional cftv
 
Guia do cftv básico
Guia do cftv   básicoGuia do cftv   básico
Guia do cftv básico
 
Padrões-02 - Padrões Arquiteturais - Camadas
Padrões-02 - Padrões Arquiteturais - CamadasPadrões-02 - Padrões Arquiteturais - Camadas
Padrões-02 - Padrões Arquiteturais - Camadas
 
Desenvolvimento agil de_software
Desenvolvimento agil de_softwareDesenvolvimento agil de_software
Desenvolvimento agil de_software
 
Fábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoFábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de Projeto
 
Html Aula 1 Parte 1
Html  Aula 1 Parte 1Html  Aula 1 Parte 1
Html Aula 1 Parte 1
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 

Semelhante a Padrão Fachada

Design fachada e Método Gabarito
Design fachada e Método GabaritoDesign fachada e Método Gabarito
Design fachada e Método Gabaritorobson santiago
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerGiovanni Kenji Shiroma
 
DVD LAB PRO - Tutorial
DVD LAB PRO - Tutorial DVD LAB PRO - Tutorial
DVD LAB PRO - Tutorial Leila Jinkings
 
Applets e Java web start
Applets e Java web startApplets e Java web start
Applets e Java web startArtur Rodrigues
 
Oficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar ConfiguraçõesOficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar ConfiguraçõesJose Augusto Carvalho
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e HudsonRodrigo Branas
 
Introdução ao android - siecomp 2015.1
Introdução ao android - siecomp 2015.1Introdução ao android - siecomp 2015.1
Introdução ao android - siecomp 2015.1Afonso Machado
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaWandesson Soares
 
2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao androidMessias Batista
 
O guia passo_a_passo
O guia passo_a_passoO guia passo_a_passo
O guia passo_a_passoESJEA
 
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de ValorSamanta Cicilia
 
Soluções de Streaming para igrejas
Soluções de Streaming para igrejasSoluções de Streaming para igrejas
Soluções de Streaming para igrejasGustavo Serafim
 
Padroes de projetos gof
Padroes de projetos gofPadroes de projetos gof
Padroes de projetos gofYan Justino
 

Semelhante a Padrão Fachada (20)

Design fachada e Método Gabarito
Design fachada e Método GabaritoDesign fachada e Método Gabarito
Design fachada e Método Gabarito
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
DVD LAB PRO - Tutorial
DVD LAB PRO - Tutorial DVD LAB PRO - Tutorial
DVD LAB PRO - Tutorial
 
Vagrant
VagrantVagrant
Vagrant
 
Applets e Java web start
Applets e Java web startApplets e Java web start
Applets e Java web start
 
Oficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar ConfiguraçõesOficina Puppet - Aprenda a Gerenciar Configurações
Oficina Puppet - Aprenda a Gerenciar Configurações
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e Hudson
 
Introdução ao android - siecomp 2015.1
Introdução ao android - siecomp 2015.1Introdução ao android - siecomp 2015.1
Introdução ao android - siecomp 2015.1
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece Java
 
2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android
 
Ubuntu COMSOLiD 5
Ubuntu COMSOLiD 5Ubuntu COMSOLiD 5
Ubuntu COMSOLiD 5
 
O guia passo_a_passo
O guia passo_a_passoO guia passo_a_passo
O guia passo_a_passo
 
Apresentacao projetorle4
Apresentacao projetorle4Apresentacao projetorle4
Apresentacao projetorle4
 
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
[Uff] Continuous Delivery: Entrega Contínua de Software de Valor
 
Soluções de Streaming para igrejas
Soluções de Streaming para igrejasSoluções de Streaming para igrejas
Soluções de Streaming para igrejas
 
Sap
SapSap
Sap
 
Apresentação aptana
Apresentação aptanaApresentação aptana
Apresentação aptana
 
Maven em 10 minutos
Maven em 10 minutosMaven em 10 minutos
Maven em 10 minutos
 
Padroes de projetos gof
Padroes de projetos gofPadroes de projetos gof
Padroes de projetos gof
 
Android Aula 4
Android Aula 4Android Aula 4
Android Aula 4
 

Mais de Eduardo Mendes

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosEduardo Mendes
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - FundamentosEduardo Mendes
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de ProjetoEduardo Mendes
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTMLEduardo Mendes
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEduardo Mendes
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails Eduardo Mendes
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Eduardo Mendes
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantesEduardo Mendes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantesEduardo Mendes
 

Mais de Eduardo Mendes (20)

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
AngularJS - Rotas
AngularJS - RotasAngularJS - Rotas
AngularJS - Rotas
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - Fundamentos
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
 
ExtJS-4
ExtJS-4ExtJS-4
ExtJS-4
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Jquery
JqueryJquery
Jquery
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de Software
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantes
 

Padrão Fachada

  • 2. Fachada   Alteração de um interface com a intenção de simplificá-la   Oculta a complexidade de um conjunto de classes
  • 4. HomeTheater   Muitas classes   Muitas interações   Você precisa saber o funcionamento de tudo para saber usar corretamente
  • 5. Para assistir um filme 1.  Ligar a máquina de pipoca 2.  Colocar a máquina de pipoca em funcionamento 3.  Reduzir as luzes 4.  Baixar a tela 5.  Ligar o projetor 6.  Congurar a entrada do projeto para DVD 7.  Colocar o projetor em modo wide-screen 8.  Ligar o amplicador de áudio 9.  Congurar a entrada do amplicador para DVD 10.  Congurar o amplicador para surround 11.  Ajustar o amplicador para o volume médio (5) 12.  Ligar o DVD Player 13.  Acionar o play no DVD Player
  • 6. Para assistir um filme Em Java 1.  Ligar a máquina de pipoca 2.  Colocar a máquina de pipoca em funcionamento 3.  Reduzir as luzes 4.  Baixar a tela 5.  Ligar o projetor 6.  Configurar a entrada do projeto para DVD 7.  Colocar o projetor em modo wide-screen 8.  Ligar o amplificador de áudio 9.  Configurar o amplificador para DVD 10.  Configurar o amplificador para surround 11.  Ajustar o amplificador para o volume médio 12.  Ligar o DVD Player 13.  Acionar o play no DVD Player pipoqueira.ligar(); pipoqueira.cozinhar(); luz.dim(10); tela.descer(); projetor.ligar(); projetor.setInput(dvdPlayer); projetor.modoWideSreen(); amplificador.ligar(); amplificador.setDVD(dvdPlayer); amplificador.setSurroundAudio(); amplificador.setVolume(5); dvdPlayer.ligar(); dvdPlayer.play(filme);
  • 7. + Problemas   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
  • 8. Solução para a complexidade   A FACHADA
  • 9. 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()
  • 10. A Fachada   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
  • 11. Solução para a complexidade   A FACHADA
  • 12. A Fachada   Preserva o acesso direto ao subsistema   Você ainda pode usar os métodos de cada aparelho
  • 13. Implementando a Fachada public class HomeTheaterFacade { Amplificador amplificador; Sintonizador sintonizador; CDPlayer cdPlayer; DVDPlayer dvdPlayer; Projetor projetor; LuzAmbiente luz; Tela tela; Pipoqueira pipoqueira; /** * Construtor */ public HomeTheaterFacade( Amplificador amplificador, Sintonizador sintonizador, CDPlayer cdPlayer, DVDPlayer dvdPlayer, Projetor projetor, LuzAmbiente luz, Tela tela, Pipoqueira pipoqueira) { this.amplificador = amplificador; this.sintonizador = sintonizador; this.cdPlayer = cdPlayer; this.dvdPlayer = dvdPlayer; this.projetor = projetor; this.luz = luz; this.tela = tela; this.pipoqueira = pipoqueira; }
  • 14. Implementando a Fachada /** * Método que simplifica o uso de vários objetos * @param filme */ public void assistirFilme(Filme filme) { System.out.println( "Tudo ok para assistir um filme!"); pipoqueira.ligar(); pipoqueira.cozinhar(); luz.dim(10); tela.descer(); projetor.ligar(); projetor.setInput(dvdPlayer); projetor.modoWideSreen(); amplificador.ligar(); amplificador.setDVD(dvdPlayer); amplificador.setSurroundAudio(); amplificador.setVolume(5); dvdPlayer.ligar(); dvdPlayer.play(filme); } /** * Outro método que simplifica * um conjunto de tarefas */ public void pararFilme(){ System.out.println("Desligando o home..."); pipoqueira.desligar(); luz.ligar(); tela.subir(); projetor.desligar(); amplificador.desligar(); dvdPlayer.parar(); dvdPlayer.eject(); dvdPlayer.desligar(); }
  • 16. Para assistir um filme de maneira simplificada public class TesteHomeTheater { public static void main(String[] args) { //Criação das instâncias dos componentes HomeTheaterFacade ht = new HomeTheaterFacade(amplificador, sintonizador, cdPlayer,dvdPlayer, projetor, luz, tela, pipoqueira); ht.assistirFilme(filme); ht.pararFilme(); } }
  • 17. Questões sobre a fachada   Encapsula as classes do sistema?   Acrescenta funcionalidade?   Cada subsistema possui somente um fachada?   Qual o benefício da fachada além de fornecer uma interface simples?   Qual a diferença da Fachada para o Adaptador?
  • 18. Um pouco mais   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
  • 19. +1 Padrão FACADE O Padrão Facade fornece uma interface unificada para um conjunto de interfaces em um subsistema. A Fachada define uma interface de nível mais alto que facilita a utilização de um subsistema.
  • 21. 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
  • 22. 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
  • 23. Princípio de Design   “Princípio do Mínimo Conhecimento – só interaja com seus amigos mais próximos.”   Ter cuidado com o número de classes com que qualquer objeto interage e também com a forma como essa interação ocorre   Minimizar o acoplamento entre classes   Evita um efeito em cascata quando houver alterações em um sistema
  • 24. Princípio de Design   Mínimo Conhecimento (Lei de Demétrio)   Em um determinado objeto, a partir de qualquer método do mesmo, só podemos invocar métodos que pertençam:   Ao próprio objeto   A objetos que tenham sido passados como parâmetros para o método   A qualquer objeto que seja criado ou instanciado pelo método   A qualquer componente do objeto
  • 25. Princípio de Design   SEM o uso do princípio public float getTemperatura() { Termometro t = estacao.getTermometro(); return t.getTemperatura(); }
  • 26. Princípio de Design   COM o uso do princípio public float getTemperatura() { return estacao.getTemperatura(); }
  • 27. Princípio de Design   Uma classe em conformidade com o princípio public class Carro { Motor motor; public Carro() { } public void ligar(Chave chave) { Portas portas = new Portas(); boolean autorizado = chave.virar(); motor.ligar(); atualizarVisorDoCarro(); portas.trancar(); } private void atualizarVisorDoCarro() { // TODO Auto-generated method stub } }
  • 28. Princípio de Design   Desvantagens   Maior número de classes que envolvem outras classes, isto pode gerar:   Aumento de complexidade   Aumento no tempo de desenvolvimento de software   Redução de desempenho