Buscar

Padrões Estruturais GoF

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 42 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 42 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 42 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

PADRÕES DE PROJETO DE SOFTWARE
Aula 3 – Padrões estruturais GoF 
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
O que veremos nesta terceira aula
Aprender as principais características dos padrões estruturais;
Conhecer os padrões de estruturais Adapter, Bridge, Composite e Decorate;
Aprender as principais aplicações e funcionalidades destes padrões.
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Classificação dos padrões GoF segundo Metsker [2]
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Decorator
"Anexar responsabilidades adicionais a um objeto dinamicamente. Decorators oferecem uma alternativa flexível ao uso de herança para estender uma funcionalidade." 
[GoF]
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
Componentes de interface gráfica (e.g., caixas de texto) decoradas com barras de rolagem e bordas.
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 1
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 1
…
public Carne(Massa pmia, double pcusto) {
mia = pmia;
nome = pmia.getNome() + " Carne ";
custo= pmia.custo() + pcusto;
}
…
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 1
…
Massa miaMassa = new Ravioli("Ravioli del chef ", 16.0);
miaMassa = new QuatroQueijos(miaMassa, 1.0);
miaMassa = new Carne(miaMassa, 5.0);
miaMassa = new Vegetais (miaMassa, 2.0);
System.out.println("Nome = " + miaMassa.getNome() + " Preço da minha massa = " + miaMassa.custo());
…
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 2
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public interface Window {
 public void draw(); // draws the Window
 public String getDescription(); // returns a description of the Window
}
public class SimpleWindow implements Window {
 public void draw() {
 // draw window }
 public String getDescription() {
 return "simple window"; }
}
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
// abstract decorator class - note that it implements Window
public abstract class WindowDecorator implements Window {
 protected Window decoratedWindow; // the Window being decorated
 
 public WindowDecorator (Window decoratedWindow) {
 this.decoratedWindow = decoratedWindow;
 }
 public void draw() {
 decoratedWindow.draw();
 }
}
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
// the first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator extends WindowDecorator {
 public VerticalScrollBarDecorator (Window decoratedWindow) {
 super(decoratedWindow); }
 public void draw() {
 decoratedWindow.draw();
 drawVerticalScrollBar(); }
 private void drawVerticalScrollBar() {
 // draw the vertical scrollbar }
 public String getDescription() {
 return decoratedWindow.getDescription() + ", including vertical scrollbars";
 }
}
 
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
// the second concrete decorator which adds horizontal scrollbar functionality
class HorizontalScrollBarDecorator extends WindowDecorator {
 public HorizontalScrollBarDecorator (Window decoratedWindow) {
 super(decoratedWindow); }
 public void draw() {
 decoratedWindow.draw();
 drawHorizontalScrollBar(); }
 private void drawHorizontalScrollBar() {
 // draw the horizontal scrollbar }
 public String getDescription() {
 return decoratedWindow.getDescription() + ", including horizontal scrollbars";
 }
} 
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 2
public class DecoratedWindowTest {
 public static void main(String[] args) {
 // create a decorated Window with horizontal and vertical scrollbars
 Window decoratedWindow = new HorizontalScrollBarDecorator (
 new VerticalScrollBarDecorator(new SimpleWindow()));
 
 // print the Window's description
 System.out.println(decoratedWindow.getDescription());
 }
}
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Decorator no JSDK
Embora na literatura sobre design patterns (GoF) a maior parte das aplicações apresentadas para uso de decoradores seja em aplicações gráficas, em Java o Swing usa outras abordagens
Ex: ScrollPane "decora" um TextArea, mas as chamadas não são feitas através do ScrollPane
Em Java, o uso mais comum de decoradores é nos objetos que representam fluxos de entrada e saída (I/O streams)
java.io: InputStream, OutputStream, Reader, Writer, etc.
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo: I/O STREAMS
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Composite
"Compor objetos em estruturas de árvore para representar hierarquias todo-parte. Composite permite que clientes tratem objetos individuais e composições de objetos de maneira uniforme.“
[GoF]
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Problema
Cliente precisa tratar de maneira uniforme objetos individuais e composições desses objetos.
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Solução
Tratar grupos e indivíduos diferentes através de uma única interface.
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Quando Usar
Sempre que houver necessidade de tratar um conjunto como um indivíduo
Funciona melhor se relacionamentos entre os objetos for uma árvore
Caso o relacionamento contenha ciclos, é preciso tomar precauções adicionais para evitar loops infinitos, já que Composite depende de implementações recursivas
Há várias estratégias de implementação
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 2
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo 3
public interface Componente { 
 public void fazerAlgo(); 
} 
public class ComponenteIndividual implements Componente { 
 public void fazerAlgo() { 
 // algo aqui 
 } 
} 
 
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Continuação Exemplo 3
public class ComponenteComposto implements Componente { 
 private LinkedList<Componente> componente= 
 new LinkedList<Componente>(); 
 // set, get, add, remove, etc para o atributo componente 
 public void fazer Algo() { 
 Iterator<Componente> it = componente.iterator(); 
 // pega todos os componentes aninhados e faz algo com eles 
 while (it.hasNext() { 
 // faz algo aqui 
 } 
 } 
} 
 
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Adapter
“Converter a interface de uma classe em outra interface esperada pelos clientes. Adapter permite a comunicação entre classes que não poderiam trabalhar juntas devido à incompatibilidade de suas interfaces." 
[GoF]
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Quando Usar
Sempre que for necessário adaptar uma interface para um cliente
Class Adapter
Quando houver uma interface que permita a implementação estática
Object Adapter
Quando menor acoplamento for desejado
Quando o cliente não usa uma interface Java ou classe abstrata que possa ser estendida
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public interface TomadaTresPinos { 
 public void fornecerEnergia(); 
} 
public interface TomadaDoisPinos { 
 public void fornecerEnergia(); 
}
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public interface PlugueTresPinos { 
 public void conectar(TomadaTresPinostomada); 
} 
public interface PlugueDoisPinos { 
 public void conectar(TomadaDoisPinos tomada); 
}
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public class TomadaEuropeia implements TomadaTresPinos { 
 public void fornecerEnergia() { 
 System.out.println("[TOMADA] Energia para um plugue de 3 pinos!"); 
 } 
}
public class TomadaComum implements TomadaDoisPinos { 
 public void fornecerEnergia() { 
 System.out.println("[TOMADA] Energia para um plugue de 2 pinos!"); 
 } 
 }
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public class PlugueEuropeu implements PlugueTresPinos { 
 public void conectar(TomadaTresPinos tomada) { 
 	System.out.println("[PLUGUE] para uma tomada de 3 pinos."); 
 	tomada.fornecerEnergia(); 
 } 
 }
public class PlugueComum implements PlugueDoisPinos { 
 public void conectar(TomadaDoisPinos tomada) { 
 	System.out.println("[PLUGUE] para uma tomada de 2pinos."); 
 	tomada.fornecerEnergia(); 
 } 
}
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public class Adaptador implements TomadaTresPinos { 
 private TomadaDoisPinos tomada; 
 public Adaptador(TomadaDoisPinos tomada) { 
 this.tomada = tomada; 
 } 
 public void fornecerEnergia() { 
 tomada.fornecerEnergia(); 
 } 
} 
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
public class Main { 
 public static void main(String[] args) { 
 TomadaDoisPinos tomada = new TomadaComum(); 
 PlugueTresPinos plugue = new PlugueEuropeu(); 
 
 Adaptador adapter = new Adaptador(tomada); 
 plugue.conectar(adapter); 
 } 
 
}
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Bridge
"Desacoplar uma abstração de sua implementação para que os dois possam variar independentemente." 
[GoF]
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Problema 1
Necessidade de um driver
Exemplo: implementações específicas para tratar objeto em diferentes meios persistentes
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Problema 2
Mas herança complica a implementação
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Solução: usar Bridge
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Quando Usar
Quando for necessário evitar uma ligação permanente entre a interface e implementação
Quando alterações na implementação não puderem afetar clientes
Quando tanto abstrações como implementações precisarem ser capazes de suportar extensão através de herança
Quando implementações são compartilhadas entre objetos desconhecidos do cliente
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Consequências de uso de Bridge
Detalhes de implementação totalmente inaccessíveis aos clientes.
Eliminação de dependências em tempo de compilação das implementações.
Implementação da abstração pode ser configurada em tempo de execução.
Exemplo de bridge: drivers JDBC
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Exemplo
…
DesenharAPI API = new WindowsAPI();
Circulo circulo = new Circulo(10, 20, 10, API);
…
PADRÕES ESTRUTURAIS GOF – AULA 3
PADRÕES DE PROJETO DE SOFTWARE
Bibliografia
Utilizando UML e Padrões: uma introdução à análise e ao projeto orientados a objetos - 3ª Edição
Autor: Larman, Craig
Padrões de Projeto: soluções reutilizáveis de software orientado a objetos
Autor: Gamma, Erich ... [et al]
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

Outros materiais