Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
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(TomadaTresPinos tomada); } 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] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Compartilhar