Prévia do material em texto
1 PADRÕES DE PROJETO DE SOFTWARE CCT0320 • Profª. Alex Casañas, M.Sc. • brulex@bol.com.br 2 3 @brulex@brulex @casanasdf@casanasdf @sabadotec@sabadotec 4 Prof. M.Sc. Alex Casañas +55(61) 984130351 (OI) ou 981356407(WhatsApp e TIM) SKYPE casanasdf Páginas oficiais: Redes Sociais e Parcerias Facebook: Brulex https://www.fb.com/alex.casanas.brulex.professor LinkedIn: Brulex http://br.linkedin.com/in/brulex Twitter: @brulex https://twitter.com/#!//casanasdf Compre com Segurança Aqui Parceria entre o Professor Alex com o site Submarino desde 1999 http://www.submarino.com.br/menu/1060/Livros/?franq=131531 5 /alex.casanas.brulex.professor/in/brulex casanasdfbrulex@bol.com.br Contatos t.me/ransomwarebr t.me/cyberseguranca 6 REVISÃO Modelo pedagógico do curso – Prof. Alex Casañas 7 7 8 PADRÕES DE PROJETO DE SOFTWARE CCT0320 Cronograma Parte Presencial Motivações para estudo de Padrões; Introdução aos Padrões; Introdução; Classificação dos Padrões GoF; Classificação dos Padrões GRASP; Padrões de construção; Padrões Estruturas; Padrões comportamentais; Discussão sobre a utilização dos Padrões; Princípios de Projetos Orientados a Objetos. . 9 10 Web+bibliografia • GAMMA, Erich et AL. Design Patterns: Elements of Reuable ObjectOriented.Software. Rio de Janeiro: AddisonWesley, 2002. • GAMMA, Erich et AL. Padrões de Projeto. 1. ed. Porto Alegre: Artmed, 2000. • LARMAN, C. Utilizando UML e padrões. 3. ed. Porto Alegre: Artmed, 2007. 11 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] 12 13 14 15 Web+bibliografia • https://www.canalti.com.br/ • https://www.youtube.com/watch?v=QUZlbMJ pbOg • Workshop sobre Padrões – Prof Andre Baltieri • Material do Prof. MSc.Vagner Figuerêdo de Santana. • Material pedagógico Estácio. 16 17 Web+bibliografia • 1. RUMBAUGH, J. Modelagem e projeto baseados em objetos. 6. ed. Rio de Janeiro: Campus, 1998. • 2. ALUR, Deepak; CRUPI, John. Core J2EE Patterns: Best Practices and Design Strategies, ed. Prentice Hall, 2002. • 3. LARMAN, C. Applying UML and Patterns, 2. ed. Prentice Hall, 2002. • 4. Paula Filho, W. P., Engenharia de Software fundamentos, métodos e padrões, 3 ed., LTC, 2009. • 5. Metsker, S.J, Padrões de Projeto em Java, 1 ed. Artmed, 2004. • https://brizeno.wordpress.com/padroes/ 18 https://www.devmedia.com.br/ 19 O que veremos nesta primeira aula � Conhecer o conceito de padrão de projeto e a suas aplicações; � Entender a descrição de um padrão de projeto e como usar; � Conhecer as duas principais famílias de padrões de projeto que serão estudadas no decorrer da disciplina; � Iniciar o estudo dos padrões de projeto da família GoF. 20 ETAPA#1 O que é o PADRÕES DE PROJETO DE SOFTWARE - CCT0320? 20 21 Questões para debate • Banca: FCC Órgão: TRT 14ª Região (RO e AC) • Prova: Tecnologia da Informação • Os padrões de projeto • a) podem deixar um sistema mais complexo ou degradar a sua performance. O seu uso indevido ou inadequado para um determinado contexto constituise em um anti pattern. 22 Questões para debate • b) sempre criam flexibilidade e variabilidade pela introdução de níveis adicionais de endereçamento indireto. Como melhoram o desempenho do sistema devem ser sempre aplicados. • c) comportamentais abstraem ou adiam o processo de criação dos objetos, ajudando a tornar o sistema dependente de como seus objetos são criados, compostos e representados. • 23 Questões para debate • d) estruturais se concentram nos algoritmos de herança entre os objetos. Eles não descrevem apenas padrões de objetos ou de classes, mas também os padrões de comunicação entre os objetos. • e)de criação se preocupam com a forma como classes e objetos são compostos para formar estruturas maiores. Utilizam o polimorfismo para compor interfaces ou implementações. 24 Questões para debate • Banca: FCC Órgão: TRT 14ª Região (RO e AC) • Prova: Tecnologia da Informação • Os padrões de projeto • a) podem deixar um sistema mais complexo ou degradar a sua performance. O seu uso indevido ou inadequado para um determinado contexto constituise em um anti pattern. 25 Explicação • https://www.devmedia.com.br/conhecaospadroesdeprojeto/957 • A. CORRETA: Em Engenharia de software, um antipadrão é um padrão de projeto de software que pode ser comumente usado mas é ineficiente e/ou contra produtivo em prática. • O termo foi cunhado em 1995 por Andrew Koenig, inspirado pelo livro do Gang of Four Design Patterns, que desenvolveu o conceito de padrão de desenho de software. O termo foi largamente popularizado três anos depois pelo livro AntiPatterns, que estendeu o uso do termo além do campo de desenho de software para interações pessoais em geral. FONTE: https://www.wikiwand.com/pt/Antipadr%C3%B5es_de_projeto_de_ software 26 Explicação • B. ERRADA: nem sempre criam flexibilidade e variabilidade. Além disso a função dos padrões não é a melhoria do desempenho do sistema, mas a resolução de problemas comuns. • C: ERRADA: São os padrões que estão preocupados com os algoritmos e as atribuições de responsabilidade entre objetos. Descrevem não só os padrões entre objetos ou classes, mas também os padrões de comunicação entre eles. • D: ERRADA: Padrões de projeto estruturais são padrões que lidam com as estruturas do projeto, facilitando a comunicação entre suas entidades. Por enquanto, esse conceito permanecerá abstrato, mas de acordo com os padrões deste tipo, entenderemos melhor. • E: ERRADA: Os padrões de criação descrevem as técnicas para instanciar objetos (ou grupos de objetos), e possibilitam organizar classes e objetos em estrutura maiores, os de comportamento se caracterizam pela maneira pelas quais classes ou objetos interagem e distribuem responsabilidades e os estruturais lidam com a composição de classes ou objetos. O segundo critério é o escopo especifica se o padrão é aplicado à classe ou objeto. 27 Introdução • Projetar software OO reusável e de boa qualidade é uma tarefa difícil; • Para realizar essa tarefa a contento, projetistas experientes usam soluções de sucesso com as quais já trabalharam no passado; • Isso leva à descoberta de padrões de projeto; • Durante duas décadas, a comunidade de padrões vem se desenvolvendo de acordo com essa dinâmica. 28 Porque usar Padrões? • Programar é uma tarefa divertida para muitas pessoas, no entanto desenvolver um software com qualidade é uma atividade complexa. Entre ótimas idéias, requisitos, visões e um produto de software que funcione, existe muito mais do que simplesmente programar (Larman, 2007). 29 30 Todas as arquiteturas orientadas a objeto possuem padrões? • Em geral, todas as arquiteturas orientadas a objeto bem estruturadas estão cheias de “padrões”. Uma das maneiras de medir a qualidade de um sistema orientado a objetos é avaliar se os colaboradores tomaram bastante cuidado com as colaborações comuns entre seus objetos. Focalizar em tais mecanismos durante o desenvolvimento de um sistema pode levar a uma arquitetura menor, mais simples, muito mais compreensível do que aquelas produzidas quanto padrões são ignorados. (Gamma et al., 2000). 31 O que é um padrão? • Maneira testada ou documentada de alcançar um objetivo qualquer; • Padrões são comuns em várias áreas da engenharia; • Design Patterns, ou Padrões de Projeto; •Padrões para alcançar objetivos na engenhariade software usando classes e métodos em linguagens orientadas a objeto; •Inspirado em "A Pattern Language" de Christopher Alexander, sobre padrões de arquitetura de cidades, casas e prédios; •"Design Patterns" de Erich Gamma, John Vlissides, Ralph Jonhson e Richard Helm, conhecidos como "The Gang of Four", ou GoF, descreve 23 padrões de projeto úteis 32 O que é um padrão? "Cada padrão descreve um problema que ocorre repetidas vezes em nosso ambiente, e então descreve o núcleo da solução para aquele problema, de tal maneira que pode-se usar essa solução milhões de vezes sem nunca fazê-la da mesma forma duas vezes" Christopher Alexander, sobre padrões em Arquitetura 33 O que é um padrão? "Os padrões de projeto são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico de design em um contexto específico" Gamma, Helm, Vlissides & Johnson, sobre padrões em software 34 O que é um padrão? “Um padrão é a abstração de uma forma concreta que ocorre muitas vezes em contextos específicos.” Riehle & Zullighoven, 1996 35 O que é um padrão? “Resolve um problema. É um conceito provado. A solução não é óbvia. Descreve um relacionamento.” Jim Coplien, 1996 36 Padrões - características • Capturam soluções de projeto exaustivamente refinadas com o passar do tempo; • São o resultado de um longo processo de projeto, re-projeto, teste e reflexão sobre o que torna um sistema mais flexível, reusável e modular; 37 Catálogos de padrões Um catálogo de padrões é um grupo de padrões que estão relacionados de uma certa forma e podem ser usados juntos ou independentemente: •Core JEE(Java Enterprise Edition); •PoEAA(PatternsofEnterprise Application Architecture); •POSA(Pattern-OrientedSoftware Architecture) •GRASP(General Responsibility Assignment Software Patterns/Principles) •GoF(Gang ofFour) 38 39 Quais são as famílias mais relevantes? • No decorrer desta disciplina, serão abordadas duas grandes famílias de padrões de projeto. • padrões GoF; • padrões GRASP. 40 O que significa GOF? • padrões GoF (do inglês, Gang of Four). 41 O que significa GRASP ? • padrões GRASP (do inglês, General Responsibility Assignment Software Patterns). 42 Mesmo não sendo desenvolverdor preciso aprender padrões? • Sim, isto lhe auxiliará em todas as etapas de construção e reaproveitamento de código; 43 44 • https://www.youtube.com/watch?v=IwxEX62 9RsE • Mostra o detalhamento dos padrões. • Aula 1044 Design Patterns Video #1 Como surgiram os padrões de projeto 12m15s 45 ETAPA#2 Histórico e Contextualização 45 46 Introdução Um pouco de história � Christopher Alexander � A Pattern Language: Towns, Buildings, Constrution (1977); � Gamma et al. � Design Patterns: Elements of Reusable Object-Oriented Software (1994). 47 • Aula 1047 Design Patterns Video #1 Como surgiram os padrões de projeto 12m15s • https://www.youtube.com/watch?v=sUyTKDHGCtA 48 49 50 Introdução Um pouco de história � Um padrão descreve � problema que ocorre repetidamente; � solução para esse problema de forma que se possa reutilizar a solução. 51 Introdução Por quê usar padrões? � Aprender com a experiência dos outros; � O jargão facilita a comunicação de princípios; � Melhora a qualidade do software; � Descreve abstrações de software; � Ajuda a documentar a arquitetura; � Captura as partes essenciais de forma compacta. 52 Introdução No entanto, padrões… � não apresentam uma solução exata; � não resolvem todos os problemas de Design; � não é exclusivo de orientação a objetos. 53 http://vincehuston.org/dp/ 54 http://gee.cs.oswego.edu/dl/ca/ca/ca.html 55 http://www.oracle.com/technetwork/java/index.html 56 Introdução Como selecionar um padrão? � Entenda as soluções; � Estude o relacionamento entre os padrões; � Estude as similaridades entre os padrões; � Conheça as principais causas de retrabalho; � Considere o que pode mudar. 57 58 59 60 61 62 ETAPA#3 Padrões GOF 62 63 O que significa GOF? • padrões GoF (do inglês, Gang of Four). • De acordo com o livro: "Padrões de Projeto: soluções reutilizáveis de software orientado a objetos", os padrões "GoF" são divididos em 23 tipos. Em função dessa grande quantidade de padrões, foi necessário classificálos de acordo com as suas finalidades. • São 3 as classificações/famílias: 64 Catálogo - GoF 65 66 67 Explicação • São 23 padrões, temos os criacionais (5): Abstract Factory; Factory Method; Builder; Prototype; Singleton. 68 Explicação • São 23 padrões, Os estruturais (7): Bridge; Decorator; Facade; Flyweight; Adapter; Proxy; Composite. 69 Explicação • São 23 padrões, os comportamentais (11): Chain of Responsability; Command; Visitor; Observer; Iterator; Strategy; Interpreter; State; Memento; Mediator; Template Method. 70 O que significa Padrões de criação? • Padrões de criação: Os padrões de criação são aqueles que abstraem e ou adiam o processo criação dos objetos. Eles ajudam a tornar um sistema independente de como seus objetos são criados, compostos e representados. • Um padrão de criação de classe usa a herança para variar a classe que é instanciada, enquanto que um padrão de criação de objeto delegará a instanciação para outro objeto. 71 O que significa “herança”? • Herança é um princípio de orientação a objetos, que permite que classes compartilhem atributos e métodos, através de "heranças". Ela é usada na intenção de reaproveitar código ou comportamento generalizado ou especializar operações ou atributos. Aula 1071 Herança na programação orientada a objetos 5m27s https://www.youtube.com/watch?v=eHOZFMA9uKs 72 O que significa “herança”? • Como exemplo podese observar as classes 'aluno' e 'professor', onde ambas possuem atributos como nome, endereço e telefone. Nesse caso podese criar uma nova classe chamada por exemplo, 'pessoa', que contenha as semelhanças entre as duas classes, fazendo com que aluno e professor herdem as características de pessoa, desta maneira pode se dizer que aluno e professor são subclasses de pessoa. 73 https://www.caelum.com.br/apostilajavaorientacaoobjetos/heranca reescritaepolimorfismo/#repetindocdigo 74 75 O que significa “instância(classe)”? • Em programação orientada a objetos, chama se instância de uma classe, um objeto cujo comportamento e estado são definidos pela classe. "Instância" é, neste caso, um anglicismo, significando "caso" ou "exemplo" (em inglês instance). • Por exemplo: "animal" é uma classe ou um molde; "cachorro" é uma instância de "animal" e apesar de carregar todas as características do molde de "animal“. 76 O que significa Padrões de criação? • Padrões de criação: Os padrões de criação tornamse importantes à medida que os sistemas evoluem no sentido de dependerem mais da composição de objetos do que a herança de classes. 77 O que significa Padrões de criação? • O desenvolvimento baseado na composição de objetos possibilita que os objetos sejam compostos sem a necessidade de expor o seu interior como acontece na herança de classe, o que possibilita a definição do comportamento dinamicamente e a ênfase deslocase da codificação de maneira rígida de um conjunto fixo de comportamentos, para a definição de um conjunto menor de comportamentos que podem ser compostos em qualquer número para definir comportamentos mais complexos. 78 O quesignifica Padrões de criação? • Padrões de criação: Há dois temas recorrentes nesses padrões. Primeiro todos encapsulam conhecimento sobre quais classes concretas são usadas pelo sistema. Segundo ocultam o modo como essas classes são criadas e montadas. Tudo que o sistema sabe no geral sobre os objetos é que suas classes são definidas por classes abstratas. 79 O que significa Padrões de criação? • Conseqüentemente, os padrões de criação dão muita flexibilidade no que é criado, quem cria, como e quando é criado. Eles permitem configurar um sistema com objetos “produto” que variam amplamente em estrutura e funcionalidade. A configuração pode ser estática (isto é, especificada em tempo de compilação) ou dinâmica (em tempo de execução). 80 81 O que significa Padrões estruturais? • Padrões estruturais: Os padrões estruturais se preocupam com a forma como classes e objetos são compostos para formar estruturas maiores. Os de classes utilizam a herança para compor interfaces ou implementações, e os de objeto ao invés de compor interfaces ou implementações, eles descrevem maneiras de compor objetos para obter novas funcionalidades. A flexibilidade obtida pela composição de objetos provém da capacidade de mudar a composição em tempo de execução o que não é possível com a composição estática (herança de classes). 82 83 O que significa Padrões comportamentais? • Padrões comportamentais: Os padrões de comportamento se concentram nos algoritmos e atribuições de responsabilidades entre os objetos. Eles não descrevem apenas padrões de objetos ou de classes, mas também os padrões de comunicação entre os objetos. 84 O que significa Padrões comportamentais? • Os padrões comportamentais de classes utilizam a herança para distribuir o comportamento entre classes, e os padrões de comportamento de objeto utilizam a composição de objetos em contrapartida a herança. Alguns descrevem como grupos de objetos cooperam para a execução de uma tarefa que não poderia ser executada por um objeto sozinho. 85 86 87 88 Por que aprender padrões? Aprender com a experiência dos outros •Identificar problemas comuns em engenharia de software e utilizar soluções testadas e bem documentadas; •Utilizar soluções que têm um nome: facilita a comunicação, compreensão e documentação; Aprender a programar bem com orientação a objetos •Os 23 padrões de projeto "clássicos" utilizam as melhores práticas em OO para atingir os resultados desejados; Desenvolver software de melhor qualidade •Os padrões utilizam eficientemente polimorfismo, herança, modularidade, composição, abstração para construir código reutilizável, eficiente, de alta coesão e baixo acoplamento. 89 Elementos de um padrão •Nome •Problema: •Quando aplicar o padrão, em que condições? •Solução: •Descrição abstrata de um problema e como usar os elementos disponíveis (classes e objetos) para solucioná-lo; •Consequências: •Custos e benefícios de se aplicar o padrão •Impacto na flexibilidade, extensibilidade, portabilidade e eficiência do sistema. 90 Formas de classificação Gamma et al [1] os classifica de duas formas •Por propósito: •criação de classes e objetos, •alteração da estrutura de um programa, •controle do seu comportamento. •Por escopo: classe ou objeto. Metsker [2] os classifica em 5 grupos, por intenção (problema a ser solucionado): • oferecer uma interface, • atribuir uma responsabilidade, • realizar a construção de classes ou objetos, • controlar formas de operação, • implementar uma extensão para a aplicação. 91 Categorização por escopo •Escopo de classe •Descrevem relacionamentos entre classes e suas subclasses (herança). •Estáticos: relacionamentos são fixos e definidos em tempo de compilação. •Escopo de objeto •Descrevem relacionamentos entre objetos. •Dinâmicos: relacionamentos entre objetos podem ser alterados em tempo de execução. 92 Categorização por finalidade De criação •Associados ao processo de criação de objetos; •Tornam um sistema independente de como seus objetos são criados, compostos e representados. Comportamentais •Têm a ver com a maneira pela qual responsabilidades são distribuídas a classes e objetos durante a realização de uma tarefa; •São abstrações de aspectos comportamentais. 93 Categorização por finalidade •Estruturais •Tratam da composição de classes e objetos para formar estruturas complexas; •Associados à maneira como classes e objetos são organizados estruturalmente; •Oferecem formas efetivas para usar conceitos OO como herança e composição; •São abstrações de aspectos estruturais. 94 95 96 Resumo do padrões GoF 1. Adapter: Converter a interface de uma classe em outra interface esperada pelos clientes. 2. Façade: Oferecer uma interface única de nível mais elevado para um conjunto de interfaces de um subsistema. 3. Composite: Permitir o tratamento de objetos individuais e composições hierárquicas desses objetos de maneira uniforme. 4. Bridge: Desacoplar uma abstração de sua implementação, de tal forma que os dois possam variar independentemente. 5. Singleton: Garantir que uma classe só tenha uma única instância, e prover um ponto de acesso global a ela. 97 Resumo do padrões GoF 6. Observer: Definir uma dependência um-para-muitos entre objetos para que, quando um objeto mudar de estado, os seus dependentes sejam notificados e atualizados. 7. Mediator: Definir um objeto que encapsula a forma como um conjunto de objetos interage. 8. Proxy: Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro. 9. Chain of Responsibility: Compor objetos em cascata para, através dela, delegar uma requisição até que um objeto a sirva. 98 Resumo do padrões GoF 10. Flyweight: Usar compartilhamento para suportar eficientemente grandes quantidades de objetos complexos. 11. Builder: Separar a construção de objeto complexo da representação para criar representações diferentes com mesmo processo. 12. Factory Method: Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar. 13. Abstract Factory: Prover interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. 99 Resumo do padrões GoF 14. Prototype: Especificar tipos a criar usando uma instância como protótipo e criar novos objetos ao copiar este protótipo. 15. Memento: Externalizar o estado interno de um objeto para que o objeto possa ter esse estado restaurado posteriormente. 16. TemplateMethod: Definir o esqueleto de um algoritmo dentro de uma operação, deixando alguns passos a serem preenchidos pelas subclasses. 17. State: Permitir a um objeto alterar o seu comportamento quando o seu estado interno mudar. 100 Resumo do padrões GoF 18. Strategy: Definir uma família de algoritmos, encapsular cada um, e fazê-los intercambiáveis. 19. Command: Encapsular uma requisição como objeto, para parametrizar clientes com diferentes requisições, filas e dar suporte a ações reversíveis. 20. Interpreter: Dada uma linguagem, definir uma representação para sua gramática junto com um interpretador. 21. Decorator: Anexar responsabilidades adicionais a um objeto dinamicamente 22. Iterator: Prover acesso sequencial a elementos de um objeto agregado, sem expor sua representação interna. 23. Visitor: Representar uma operação a ser realizada sobre os elementos de uma estrutura de objetos. 101 Classificação dos padrões GoF segundo Metsker [2] 102 GoF – Criacionais (Capítulo 3) 10 2 � Singleton; � Factory Method; � Abstract Factory; � Prototype; � Builder. 103 GoF – Criacionais Singleton � Intenção: Garantir que uma classe tenhasomente uma instância e fornecer um ponto de acesso à instância. 104 GoF – Criacionais Singleton � Estrutura: <<singleton>> Class A - static instance : Class A - Class A() + static getInstance() : Class A Client 105 GoF – Criacionais Singleton � Exemplo: class Singleton{ private static Singleton instance; private Singleton{ } public static Singleton getInstance(){ if( instance == null ) instance = new Singleton(); return instance; } } 106 GoF – Criacionais Singleton � Use quando: �Deve haver exatamente uma instância da classe; �Deve deve ser facilmente acessível aos clientes em um ponto de acesso bem conhecido. Aula 1106 Classe Singleton de Configuração Mindset POO Aula 10 10m12s https://www.youtube.com/watch?v=AbhdjDbFUvI https://brizeno.wordpress.com/2011/09/24/maonamassasingleton/ 107 GoF – Criacionais Factory Method � Intenção: Definir uma interface para criação de um objeto, mas deixar as subclasses decidirem qual classe instanciar. 108 109 GoF – Criacionais Factory Method � Estrutura: <<abstract>> Creator + factoryMethod() <<abstract>> <<abstract>> Product ConcreteProductConcreteCreator creates + factoryMethod() 110 GoF – Criacionais Factory Method � Exemplo: abstract class Product{ ... } class ... } ConcreteProductA extends Product{ class ... ConcreteProductB extends Product{ } 111 GoF – Criacionais Factory Method � Exemplo: abstract class Creator{ public abstract Product create(); } class ConcreteCreatorA extends Creator{ public Product create(){ return new ConcreteProductA() ; } } class ConcreteCreatorB extends Creator{ public Product create(){ return new ConcreteProductB() ; } } 112 GoF – Criacionais Factory Method � Exemplo: class GoFTest{ public static void main( String a[] ){ Creator c ; // If A is needed c = new ConcreteCreatorA() ; // else c = new ConcreteCreatorB() ; Product p = c.create() ; } } 113 GoF – Criacionais Factory Method � Use quando: �Uma classe não pode antecipar a classe de objetos que precisa criar; �Uma classe deseja que suas subclasses especifiquem os objetos que cria. 114 Factory method "Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar. Factory Method permite que uma classe delegue a responsabilidade de instanciamento às subclasses." [GoF] 115 Prós e contras • Vantagens • Criação de objetos é desacoplada do conhecimento do tipo concreto do objeto • Conecta hierarquias de classe paralelas • Facilita a extensibilidade • Desvantagens • Ainda é preciso saber a classe concreta do criador de instâncias (pode- se usar uma classe Factory, com método estático e parametrizado que chame diretamente o Factory Method): 116 Exemplo 1 public class Montadora{ public void novoCarro(String tipo){ Carro carroZero; if(tipo.equals(“Vectra”)) carroZero = new Vectra(); else if(tipo.equals(“Omega”)) carroZero = new Omega(); else if(tipo.equals(“Gol”)) carroZero = new Gol(); else if(tipo.equals(“Golf”)) carroZero = new Golf(); } }; Aula 1116 Factory Method Pattern 8m46s https://www.youtube.com/watch?v=wQONM89Dlbg https://brizeno.wordpress.com/2011/09/17/m aonamassafactorymethod/ 117 GoF – Criacionais Abstract Factory � Intenção: Fornecer interface para criação de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas. 118 119 120 121 • http://www.vincehuston.org/dp/ • http://www.vincehuston.org/dp/ • Exemplos de código em Java e C++ 122 Continuação do Exemplo 1 123 GoF – Criacionais Abstract Factory � Estrutura: <<abstract>> AbstractFactory + createA() <<abstract>> + createB() <<abstract>> ConcreteFactory1 + createA() + createB() ConcreteFactory2 + createA() + createB() 124 GoF – Criacionais Abstract Factory � Use quando: �Um sistema deveria ser independente de como seus produtos são criados, compostos e representados; �Um sistema deveria ser configurados com uma ou várias famílias de produtos; �Uma família de objetos é destinada a ser usada de maneira única. 125 Abstract Factory "Prover uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas." [GoF] 126 Problema 127 Estrutura de Abstract Factory 128 Exemplo 1 https://brizeno.wordpress.com/2011/09/18/maonamassaabstractfactory/ 129 GoF – Criacionais Prototype � Intenção: Especificar os tipos de objetos a serem criados usando uma instância- protótipo. Novos objetos são criados pela cópia desse protótipo(clones). 130 GoF – Criacionais Prototype � Estrutura: Client Prototype + clone() ConcretePrototype + clone() + op() prototype -> clone() return copy of self 131 GoF – Criacionais Prototype � Exemplo: GraphicTool Graphic + draw( coord ) + clone() Staff + draw( coord ) + clone() MusicalNote + draw( coord ) + clone() WholeNote + draw( coord ) + clone() HalfNote + draw( coord ) + clone() 132 GoF – Criacionais Prototype � Use quando: �Classes a instanciar são especificadas em tempo de execução; � Instâncias de classes podem ter poucas combinações de estado. Aula 1132 Prototype Pattern Pattern 15m11s https://www.youtube.com/watch?v=Wi_22Oln_c https://brizeno.wordpress.com/2011/12/05/maonamassaprototype/ 133 GoF – Criacionais Builder � Intenção: Separar a construção de um objeto complexo de sua representação de modo que o mesmo processo de construção possa criar diferentes representações. 134 GoF – Criacionais Builder � Exemplo: class Director{ ... private Builder b ; b = new ConcreteBuilder() ; for( Object o : Collection ) b.buildPart( o ) ; Product p = b.getResult() ; ... } 135 GoF – Criacionais Builder � Exemplo: abstract class Builder{ abstract buildPart( Part p ); } class ConcreteBuilder extends Builder{ public Part buildPart( PartA a ){...} public Part buildPart( PartB b ){...} public Product getResult(){...} // Product of A&B is returned } 136 GoF – Criacionais Builder � Use quando: �O algoritmo para criar um objeto complexo deveria ser independente das partes que compõem o objeto �O processo de construção deve permitir diferentes representações para o objeto que é construídos Aula 1136 Builder Pattern 9m32s https://www.youtube.com/watch?v=7bZDPzF6RXw https://brizeno.wordpress.com/2011/09/25/maonamassabuilder/ 137 138 GoF – Criacionais (Capítulo 3) �O que vimos até agora: � Singleton(Responsabilidade); � Factory Method(Contrução); � Abstract Factory(Contrução); � Prototype(Contrução); � Builder(Contrução). 139 Classificação dos padrões GoF segundo Metsker [2] 140 GoF – Estruturais (Capítulo 4) �O que iremos ver agora? � Composite(interfaces); � Decorator(estensões) � Proxy (Responsabilidade); � Adapter (interfaces); � Bridge (interfaces); � Facade (interfaces); � Flyweight (Responsabilidade); 141 GoF – Estruturais Composite � Intenção: Compor objetos em estruturas de árvore para representarem hierarquias do tipo todo-parte. 142 GoF – Estruturais Composite � Estrutura: Client <<abstract>> Component + op() + add( :Component ) + remove( :Component ) + getChild( int ) Leaf + op() Composite + op() + add( :Component ) + remove( :Component ) + getChild( int ) 143 GoF – Estruturais Composite � Exemplo: Client <<abstract>>Component + op() + add( :Component ) + remove( :Component ) + getChild( int ) File + op() Directory * + op() + add( :Component ) + remove( :Component ) + getChild( int ) 144 GoF – Estruturais Composite �Use quando: �Você quer representar hierarquia de objetos do tipo parte-todo; �Você quer que clientes tratem objetos compostos e individuais da mesma forma. Aula 1144 Composite Pattern Implementando 7m47s https://www.youtube.com/watch?v=p0YPcMUppg8 https://brizeno.wordpress.com/2011/09/12/maonamassacomposite/ 145 GoF – Estruturais Decorator � Intenção: Dinamicamente, agregar funcionalidades a um objeto. 146 GoF – Estruturais Decorator � Estrutura: + op() Concrete component.op() <<abstract>> Component + op() Component <<abstract>> Decorator ConcreteDecoratorB - addedState + op() + addedBehavior() ConcreteDecoratorA - addedState + op() + addedBehavior() 147 GoF – Estruturais Decorator � Exemplo: abstract class Decorator{ ... private Component component ; public Decorator( Component c ){ component = c ; } ... public void operation(){ component.operation() ; } } 148 GoF – Estruturais Decorator � Exemplo: class GoFTest{ ... Component c = new ConcreteDecoratorA( new ConcreteDecoratorB( new ConcreteComponent())); c.operation(); ... } 149 GoF – Estruturais Decorator � Outro exemplo: Sanduich s = new Hamburguer( new Hamburguer( new Letuce( new Cheese( new SpecialSpice( new Onion( new Pickles( new BreadWithGergelim()))))))); 150 GoF – Estruturais Decorator � Use quando: �Deseja adicionar responsabilidades para objetos individuais dinamicamente, de maneira transparente e sem afetar outros objetos; �Quando uma hierarquia de subclasses não é prática devido ao grande número de possibilidades (explosão de classes). Aula 1150 Decorator Pattern 12m12s https://www.youtube.com/watch?v=3_iV0hPlbKQ https://brizeno.wordpress.com/2011/08/31/decorator/ 151 GoF – Estruturais Proxy � Intenção: Fornecer um representante de um objeto para controlar o acesso ao mesmo. 152 GoF – Estruturais Proxy � Estrutura: Client Subject + request() Proxy + request() RealSubject + request() Proxy.request() uses RealSubject.request() 15 2 153 GoF – Estruturais Proxy 15 3 � Exemplo: class RealSubject extends Subject{ ... public request(){ // implementation of the request } ... } 154 GoF – Estruturais Proxy � Exemplo: class Proxy extends Subject{ ... public request(){ Subject s = new RealSubject() ; s.request() ; } ... } 155 GoF – Estruturais Proxy � Exemplo: class GoFTest{ ... Subject s = new Proxy() ; s.request() ; ... } 156 GoF – Estruturais Proxy �Use quando: �Há a necessidade de uma referência sofisticada ou versátil a um objeto (mais do que um simples ponteiro). Aula 1156 Proxy Pattern Implementando 15m48s https://www.youtube.com/watch?v=4YWtUT4MKtw https://brizeno.wordpress.com/2011/10/01/maonamassaproxy/ 157 GoF – Estruturais Adapter � Intenção: Converter a interface de uma classe em outra que os clientes esperam. 158 GoF – Estruturais Adapter � Estrutura (class adapter): Client Adapter + request() <<abstract>> Target + request() Adaptee + specificRequest() specificRequest() 159 GoF – Estruturais Adapter � Estrutura (object adapter): Client Adapter + request() <<abstract>> Target + request() Adaptee + specificRequest() adaptee.specificRequest() 160 GoF – Estruturais Adapter �Exemplo (object adapter): abstract class Target{ public abstract void request(); } class Adapter extends Target{ public void request(){ Adaptee a = new Adaptee(); a.specificRequest(); } } 161 GoF – Estruturais Adapter � Use quando: �Deseja usar uma classe existente, mas sua interface não combina com o que precisa; � Você precisa criar classes reutilizáveis que cooperem com classes não previstas. Aula 1161 Adapter Pattern 16m10s https://www.youtube.com/watch?v=xa9WDIM4yxs https://brizeno.wordpress.com/2011/10/03/maonamassaadapter/ 162 GoF – Estruturais Facade �Intenção: Fornecer uma interface unificada para um conjunto de interfaces de um subsistema. 163 GoF – Estruturais Facade � Estrutura: Façade subsystem classes 164 GoF – Estruturais Facade � Exemplo: class Facade{ public Response parseRequest( Request r ){ RequestController rc; rc = RequestController.getInstance(); return rc.parse( r ); } public boolean areYouAlive(){ SystemController sc ; sc = SystemController.getInstance() ; return sc.isAlive(); } } 165 GoF – Estruturais Facade � Use quando: � Precisar de uma interface simples para um subsistema complexo; �Há muitas dependências entre clientes e classes de implementações de uma abstração �Desejar dividir seu sistema em camadas. Aula 1165 - Façade Pattern Implementando 10m27s https://www.youtube.com/watch?v=lrODwcK- CgQ&list=PLPUp6rbjBTHDehxG3dggOQ9V9EPm8O7hR&index=14 https://brizeno.wordpress.com/2011/11/17/maonamassafacade/ 166 GoF – Estruturais Bridge � Intenção: Desacoplar uma abstração de sua implementação, de modo que as duas possam variar independentemente. 167 GoF – Estruturais Bridge � Antes de falar do problema é preciso dizer que este padrão é bem parecido com o Factory Method e o Abstract Factory, então vamos analisar o mesmo exemplo para ver melhor as diferenças e semelhanças entre eles. 168 GoF – Estruturais Bridge O problema é que precisamos modelar um sistema de venda de carros para uma concessionária. Queremos que o sistema seja flexível, para adição de novos carros, e de fácil manutenção. Vimos que com os padrões Factory Methode o Abstract Factory podemos alcançar este resultado de maneira bem simples. 169 GoF – Estruturais Bridge O problema é que precisamos modelar um sistema de venda de carros para uma concessionária. Queremos que o sistema seja flexível, para adição de novos carros, e de fácil manutenção. Vimos que com os padrões Factory Methode o Abstract Factory podemos alcançar este resultado de maneira bem simples. https://brizeno.wordpress.com/2011/09/25/maona massabuilder/ 170 GoF – Estruturais Bridge O problema é que precisamos modelar um sistema de venda de carros para uma concessionária. Queremos que o sistema seja flexível, para adição de novos carros, e de fácil manutenção. Vimos que com os padrões Factory Methode o Abstract Factory podemos alcançar este resultado de maneira bem simples. https://brizeno.wordpress.com/2011/09/25/maona massabuilder/ 171 RefinedAbstraction + operation() GoF – Estruturais Bridge � Estrutura: Client <<abstract>> Implementor + operationImpl () ImplementorA + operationImpl () ImplementorB + operationImpl () <<abstract>> Abstraction + operation() 172 RefinedAbstraction + drawRect() GoF – Estruturais Bridge � Exemplo: Client <<abstract>> WindowImpl + devDrawLine () XWindowImpl + devDrawLine () PMManager + devDrawLine () <<abstract>> Window + drawRect() imp.devDrawLine() imp.devDrawLine() imp.devDrawLine() imp.devDrawLine() 173 174 GoF – Estruturais Bridge �Use quando: �Deseja evitar acoplamento permanente entre abstração e sua implementação; �Abstração e implementação devem ser extensíveis; �Mudanças na implementação não devem ter impactos nos clientes que usam a abstração. https://brizeno.wordpress.com/2011/10/13/maonamassabridge/175 O termo “Acoplamento”? • Em engenharia de software, acoplamento ou dependência • é o grau em que um módulo depende de outros módulos de programação. • Modularização em tecnologia da informação é um conceito onde o sistema ou software é dividido em partes distintas. Compõe o ferramental necessário para um programa mais legível com uma melhor manutenção e melhor desempenho por meio da programação estruturada. 176 https://github.com/casanasdf/PadresdeProjeto • Neste repositório existem exemplos de utilização de Padrões de Projeto documentados pela Gangue dos Quatro implementados em Java. • Para saber mais informações sobre os problemas abordados em cada um dos projetos acesse: brizeno.wordpress.com/padroes 177 178 GoF – Estruturais Flyweight � Intenção: Usar compartilhamento para suportar eficientemente grandes quantidades de objetos com granularidade fina. 179 GoF – Estruturais Flyweight � Estrutura: Client FlyweightFactory + getFlyweight(key) Flyweight + operation(extrinsicState) ConcreteFlyweight - intrinsicState + operation(extrinsicState) UnsharedConcreteFlwweight - allState + operation(extrinsicState) if( flyweight[key] exists){ return flyweight[key] } else { create new flyweight; add it to pool of flyweight; return the new flyweight } 180 GoF – Estruturais Flyweight � Exemplo: class FlyweightFactory{ private Flyweight pool[]; public Flyweight getFlyweight(int key) { if( pool[ key ] != null ){ pool[key] = new ConcreteFlyweight(); } return pool[key] ; } } 181 GoF – Estruturais Flyweight � Exemplo: class GoFTest{ ... private fc FlyweightFactory; fc = new FlyweightFactory(); Flyweight f = fc.getFlyweight( Flyweight.A ); f.operation( newState ) ; f.run(); ... } 182 GoF – Estruturais Flyweight �Use quando todos estes forem verdade: �Uma aplicação usa um grande número de objetos; �Custo de armazenagem é alto (muitos objetos); �Boa parte do estado do objeto pode ser extrínseca; 183 GoF – Estruturais Flyweight � Use quando todos estes forem verdade: �Muitos grupos de objetos podem ser trocados por relativamente poucos objetos quando a parte extrínseca é removida; �A aplicação não depende da identidade dos objetos, uma vez que serão compartilhados. Aula 1183 Flyweight e aplicação em jogos 8m04s https://www.youtube.com/watch?v=qUtUXnu6yB0 https://brizeno.wordpress.com/2011/11/13/maonamassaflyweight/ 184 185 Classificação dos padrões GoF segundo Metsker [2] 186 GoF – Estruturais (Capítulo 4) �O que vimos até agora: � Composite(interfaces); � Decorator(estensões) � Proxy (responsabilidade); � Adapter (interfaces); � Bridge (interfaces); � Facade (interfaces); � Flyweight (responsabilidade); 187 GoF – Comportamentais (Capítulo 5) � O que veremos agora: � Template method (operações); � Interpreter (operações); � Mediator (responsabilidade); � Chain of responsibility (responsabilidade); � Observer (responsabilidade); 188 GoF – Comportamentais (Capítulo 5) � State (operações); � Strategy (operações); � Command (operações); � Memento (construção); � Iterator (extensões); � Visitor (extensões). 189 GoF – Comportamentais Template Method � Intenção: �Definir o esqueleto de um algoritmo postergando alguns passos para as subclasses; � As subclasses podem redefinir certos passos de um algoritmo sem mudar sua estrutura. 190 GoF – Comportamentais Template Method � Estrutura: <<abstract>> AbstractClass + templateMethod() + op1() <<abs>> + op2() <<abs>> ConcreteClass + op1() + op2() public void templateMethod(){ ... op1() ... op2() ... } 191 GoF – Comportamentais Template Method �Exemplo: <<abstract>> Clusterer + doCluster( o ) + getDistance( o ) + updateCentroids() EuclideanClusterer + getDistance() + updateCentroid() public void doCluster( Object o ){ ... // for all the objects d = getDistance( o ) ; // add to the closest cluster’s centroid ... // after setting clusters to all objects updateCentroids() ; ... // do it untill centroids don’t change } Abstract methods 192 GoF – Comportamentais Template Method � Use quando: �Deseja implementar partes invariantes de um algoritmo uma vez e deixar que subclasses implementem o comportamento que pode variar; �Um comportamento comum de subclasses pode ser divido e colocado em uma classe comum para evitar duplicação de código; �Desejar controlar extensão de subclasses. 193 GoF – Comportamentais Template Method � Use quando: � https://brizeno.wordpress.com/2011/09/18/mao-na- massa-template-method/ � Aula 1193 – Template method 8m04s � https://www.youtube.com/watch?v=vFdwKnPf8Fw&lis t=PLPUp6rbjBTHDehxG3dggOQ9V9EPm8O7hR&ind ex=9 194 GoF – Comportamentais Interpreter � Intenção: Dada uma linguagem, definir uma representação para sua gramática juntamente com um interpretador que usa a representação para interpretar sentenças na linguagem. 195 GoF – Comportamentais Interpreter � Estrutura: Client TerminalEx + interpret(Context) <<abstract>> Expression + interpret(Context) pression NonterminalExpressionContext + interpret(Context) 196 GoF – Comportamentais Interpreter � Exemplo: Client NumberExp + interpret(Context) <<abstract>> SpreadSheetExpression + interpret(Context) ression CellExpressionContext + interpret(Context) 197 GoF – Comportamentais Interpreter �Use quando: �Há uma gramática para interpretar e você pode representar sentenças dessa linguagem como árvores abstratas de sintaxe; �Funciona melhor quando �A gramática é simples; �Eficiência não é um ponto crítico. 198 GoF – Comportamentais Interpreter � Use quando: � https://brizeno.wordpress.com/2011/11/19/mao-na- massa-interpreter/ � Vídeo em Inglês; � Aula 1193 - Interpreter Patters 15m46s - Inglês � https://www.youtube.com/watch?v=IU-4NG-XGhg 199 GoF – Comportamentais Mediator � Intenção: �Definir um objeto que encapsula a forma como um conjunto de objetos interage; �Promove o baixo acoplamento evitando que objetos façam referência a outros explicitamente. 200 GoF – Comportamentais Mediator � Estrutura: <<abstract>> Colleague <<abstract>> Mediator ConcreteMediator ConcreteColleagueA ConcreteColleagueB 201 GoF – Comportamentais Mediator� Exemplo: <<abstract>> UIComponent SuggestionsList TextFieldConcreteMediator <<abstract>> Mediator + propagate( UIComponent ) + propagate( UIComponent ) + setList( String )+ getSelection() + setText( String ) + getText() + changed() mediator.propagate( this ) 202 GoF – Comportamentais Mediator � Use quando: �Objetos se comunicam de maneira bem definida, mas complexa; �Um objeto tem reúso restrito pois se comunica e referencia muitos objetos; �Um comportamento que é distribuído entre várias classes deveria ser customizável sem utilizar muita herança. 203 GoF – Comportamentais Mediator � Use quando: https://brizeno.wordpress.com/2011/10/26/maonamassa mediator/ Aula 1203 MEDIATOR Padrões de Projeto 5m30s https://www.youtube.com/watch?v=K3S4XFEJ5o0 204 GoF – Comportamentais Chain of Responsibility � Intenção: �Evitar acoplamento entre remetente e destinatário de um pedido, dando a mais de um objeto a chance de responder um pedido; �Encadeia objetos e passa request até que um deles responda. 205 GoF – Comportamentais Chain of Responsibility � Estrutura: Client ConcreteHandler1 + handleRequest() ConcreteHandler2 + handleRequest()Handler - successor + handleRequest() if can handle request{ handle request } else { successor.handleRequest() } 206 GoF – Comportamentais Chain of Responsibility � Exemplo: Client MouseLogger + log( Event ) KeyPressLogger + log( Event ) EventLogger - successor + log( Event ) if can log Event{ log Event data } else { successor.log( Event ) } 207 GoF – Comportamentais Chain of Responsibility Use quando: �Mais de um objeto pode manipular uma requisição e o handler(subrotina, manipuladoras de eventos ) não é conhecido de antemão. O handler deveria ser associado automaticamente; � Você quer enviar uma requisição para vários objetos sem especificar o destinatário explicitamente; �O conjunto de objetos que pode manipular uma requisição pode ser especificado dinamicamente. 208 GoF – Comportamentais Chain of Responsibility Use quando: https://brizeno.wordpress.com/2011/11/09/mao-na- massa-chain-of-responsibility/ Aula 1208 - Chain of Responsibility - exemplo - 5m30s https://www.youtube.com/watch?v=aJQnG_f1ywA 209 GoF – Comportamentais Observer � Intenção: Define uma interdependência 1 para n entre objetos, de forma que quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados. 210 GoF – Comportamentais Observer � Exemplo: class ConcreteSubject extends Subject{ private List<Observer> observers ; //N private State state ; ... public void attach( Observer o ){ o.setSubject( this ) ; observers.add( o ) ; } ... (continua) 211 GoF – Comportamentais Observer � Exemplo: public void detach( Observer o ){ o.setSubject( null ) ; observers.remove( o ) ; } public void notify(){ // i is iterator of observers list while(i.hasNext()){ Observer o = i.next() ; o.update() ; } } } 212 GoF – Comportamentais Observer � Exemplo: class ConcreteObserver extends Observer{ private Subject subject ; //1 private State state ; ... public void setSubject( Subject s ){ subject = s ; } public void update(){ state = subject.getState() ; } } 213 GoF – Comportamentais Observer � Exemplo: class GoFTest{ ... public static void main( String args[] ){ // 1 ‘source’ Subject s = new ConcreteSubject() ; // N dependents Observer o1 = new ConcreteObserver() ; s.attach( o1 ) ; Observer o2 = new ConcreteObserver() ; s.attach( o2 ) ; ... } } 214 GoF – Comportamentais Observer� Use quando: �Uma abstração tiver dois aspectos, um dependente do outro. Encapsular esses aspectos em objetos separados possibilita reusá-los independentemente; �Uma mudança 1:n ocorre e você não sabe quantos objetos precisam ser alterados; �Um objeto precisa notificar outros objetos sem fazer suposições sobre quem eles são. 215 GoF – Comportamentais Observer � Considerando o sensor de um radar de velocidade, o que é mais adequado Mediator ou Observer? <<colleague>> Sensor <<colleague>> Camera <<colleague>> Display Mediator <<subject>> Sensor <<observer>> Camera <<observer>> Display 216 GoF – Comportamentais Observer � https://brizeno.wordpress.com/2011/10/17/mao-na-massa observer/ � Aula 1216 - Observer Pattern Padrão de Projeto 11m10s � https://www.youtube.com/watch?v=1Hv- XwzVkrU&list=PLPUp6rbjBTHDehxG3dggOQ9V9EPm8O 7hR&index=5 217 GoF – Comportamentais State 217 � Intenção: Permite a um objeto alterar seu comportamento quando seu estado interno muda. O objeto parecerá ter “mudado de classe”. 218 GoF – Comportamentais State � Estrutura: <<abstract>> State + handle () ConcreteStateA + handle () ConcreteStateB + handle() Context + request() state.handle() 218 219 GoF – Comportamentais State 219 �Exemplo: class Sensor{ private State state ; public setState( State s ){ state = s ; } public int trackSpeed(){ return state.handle( this ) ; } } 220 GoF – Comportamentais State � Exemplo: abstract class State{ abstract void handle( Sensor s ) ; } class CarPassing extends State{ public int handle( Sensor s ){ int speed = s.getSpeed() ; s.setState( new NoCarPassing() ); return speed ; } } 221 GoF – Comportamentais State � Use quando: �O comportamento de um objeto depende do seu estado ele deve mudá-lo em tempo de execução; �Operações tem vários fluxos condicionais que dependem do estado do objeto. State coloca cada um desses fluxos em uma classe separada. 222 GoF – Comportamentais State � Use quando: � https://brizeno.wordpress.com/2011/11/21/mao-na- massa-state/ � Aula 1222 - State Pattern Implementando 11m12s � https://www.youtube.com/watch?v=DS0puoKlojw&l ist=PLPUp6rbjBTHDehxG3dggOQ9V9EPm8O7hR &index=15 223 GoF – Comportamentais Strategy � Intenção: �Define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis; � Strategy permite que o algoritmo varie independentemente dos clientes que a utilizam. 224 GoF – Comportamentais Strategy � Estrutura: <<abstract>> Strategy + algorithm () ConcreteStrategyA + algorithm () ConcreteStrategyB + algorithm () Context + contextInterface() strategy.algorithm() 225 GoF – Comportamentais Strategy � Exemplo: <<abstract>> Sorter + sort ( List ) BubbleSorter + sort ( List ) MergeSorter + sort ( List ) Context + showList() sorter.sort( List ) 226 GoF – Comportamentais Strategy � Use quando: � Várias classes relacionadas diferem somente no comportamento; � Precisa de variantes de um certo algoritmo; �Um algoritmo usa dados que clientes não precisam ter conhecimento; �Uma classe define muitos comportamentos que aparecem em vários fluxos condicionais. 227 GoF – Comportamentais Strategy � Use quando: � https://brizeno.wordpress.com/2011/08/31/strategy/ � Aula 1227 - Strategy Pattern Implementando 11m14s � https://www.youtube.com/watch?v=noocoTJUV0Y&list= PLPUp6rbjBTHDehxG3dggOQ9V9EPm8O7hR&index= 11 228 GoF – Comportamentais Command � Intenção: � Encapsular uma requisição em um objeto, permitindo: � parametrizar clientes; � enfileirar requisições; � registrar requisições; � suportar operações que podem ser desfeitas. 229 GoF – Comportamentais Command � Estrutura: <<abstract>> Command + execute () <<abstract>> Receiver + action () Invoker Client ConcreteCommand - state + execute () 230 GoF – Comportamentais Command � Exemplo: <<abstract>> Command + execute () <<abstract>> Document + delete () + copy() + paste() Application DeleteCommand - state + execute () Menu MenuItem + clicked() command.execute() document.paste() 231 GoF – Comportamentais Command � Use quando: � Desejar parametrizar objetos com base na ação a ser executada; � Desejar especificar filas e executar solicitações em tempos diferentes; � Desejar implementar “desfazer”; � Desejar implementar logging(registro de eventos) de ações para serem reaplicadas em sistemas em caso de crash; � Desejar estruturar um sistema em operações em alto nível construídas com base em operações. 232 GoF – Comportamentais Command � Use quando: � https://brizeno.wordpress.com/2011/11/04/mao-na-massa-command/ � Aula 1232 - Command Pattern Padrão de Projeto 12m12s � https://www.youtube.com/watch?v=yBQOjvTc7zM&list=PLPUp6rbjBTHDe hxG3dggOQ9V9EPm8O7hR&index=6 233 GoF – Comportamentais Memento � Intenção: Sem violar encapsulamento, capturar e externalizar o estado interno de um objeto de maneira que o objeto possa retornara esse estado mais tarde. 234 GoF – Comportamentais Memento � Estrutura: CaretakerOriginator - state + setMemento(Memento m) + createMemento() Memento - state + getState() + setState(State s) return new Memento(state) state = m.getState() 235 GoF – Comportamentais Memento � Exemplo: Ga - state +setCheckpoin +createCheckp return new Checkpoint(state) state = c.getState() me Checkpoint - state t(Checkpoint c) + getState() oint() + setState(State s) CheckpointController 236 GoF – Comportamentais Memento � Use quando: �Um snapshot de alguma parte do objeto precisa ser salva para que seja restaurada no futuro; e �Uma interface direta para obter o estado expõe detalhes de implementação e quebraria o encapsulamento do objeto. 237 GoF – Comportamentais Memento � Use quando: � https://brizeno.wordpress.com/2011/11/05/mao-na-massa- memento/ � Aula 1237 - Memento Pattern Exemplo de implementação - 12m38s � https://www.youtube.com/watch?v=KEddBJMSsms&list=PLP Up6rbjBTHDehxG3dggOQ9V9EPm8O7hR&index=7 238 GoF – Comportamentais Iterator � Intenção: Fornecer um meio de acessar, sequencialmente, os elementos de uma agregação sem expor sua representação interna. 239 GoF – Comportamentais Iterator � Estrutura: <<abstract>> Iterator + first() + next() + isDone() + currentItem() ConcreteIterator Client <<abstract>> Aggregate + createIterator() ConcreteAggregate + createIterator() return new ConcreteIterator(this) 240 GoF – Comportamentais Iterator � Exemplo: <<abstract>> Iterator + first() + next() + isDone() + currentItem() BinaryTreeIterator Client <<abstract>> AbstractTree + createIterator() BinaryTree + createIterator() return new BinaryTreeIterator(this) 241 GoF – Comportamentais Iterator � Use quando: �Quiser acessar conteúdo de uma coleção de objetos sem expor sua representação interna; �Quiser fornecer uma interface uniforme para navegar em diferentes estruturas de coleções de objetos (suportar iteração polimórfica). 242 GoF – Comportamentais Iterator � Use quando: � https://brizeno.wordpress.com/2011/09/15/mao-na-massa- iterator/ � Aula 1242 - Iterator Pattern Exemplo de implementação 12m38s � https://www.youtube.com/watch?v=wXGDRuXflnw&index= 8&list=PLPUp6rbjBTHDehxG3dggOQ9V9EPm8O7hR 243 GoF – Comportamentais Visitor � Intenção: �Representar uma operação a ser executada nos elementos de uma estrutura de objetos. �Visitor permite definir uma nova operação sem mudar a classe dos elementos sobre os quais opera. 244 GoF – Comportamentais Visitor � Estrutura: <<abstract>> Visitor + visitElement(ConcreteElement) ConcreteVisitor Client <<abstract>> Element + accept( Visitor ) ConcreteElement + accept ( Visitor v ) + op() v.visitConcreteElement( this ) ObjectStructure 245 GoF – Comportamentais Visitor � Exemplo: <<abstract>> Visitor + visitNode(ConcreteNode) + visitNode(OtherConcreteNode) NodeVisitor Client <<abstract>> Node + accept( Visitor ) ConcreteNode + accept ( Visitor v ) Graph + op() v.visitNode( this ) 246 GoF – Comportamentais Visitor � Use quando: � A estrutura de um objeto contém muitas classes de objetos com interfaces diferentes e você deseja realizar operações nesses objetos; � Operações diferentes e não relacionadas precisam ser aplicadas em uma estrutura de objetos e você não deseja “poluí-los” com essas operações; � Classes definindo estruturas raramente mudam, mas comumente você deseja definir novas operações nessa estrutura. 247 GoF – Comportamentais Visitor � Use quando: � https://brizeno.wordpress.com/2011/11/26/mao-na-massa- visitor/ � Padrões que utilizem estruturas de dados para representação podem utilizar o padrão Visitor, por exemplo, uma estrutura Composite ou Interpreter, pode oferecer um método de visita e atribuir para as classes visitantes a responsabilidade das operações sobre seu conjunto de dados. 248 GoF Relacionamento entre padrões Builder Iterator Composite Decorator Flyweight Visitor Singleton Facade Abstract Factory Prototype Factory Method Template Method Strategy State Interpreter Chain of Responsibility Proxy BridgeCommand Memento Adapter ObserverMediator 249 250 ETAPA#3 Questões para Debate 250 251 Questões para debate • Banca: COPEVE Órgão: MPEAL Prova: Analista • Na literatura de engenharia de software, além dos padrões GRASP, é comum classificar os padrões de projeto em 3 tipos: padrões de criação, padrões estruturais e padrões • a) comportamentais. b) de testes. • c) de implantação. d) de análise. • e) de visualização. 251 252 Questões para debate • Banca: COPEVE Órgão: MPEAL Prova: Analista • Na literatura de engenharia de software, além dos padrões GRASP, é comum classificar os padrões de projeto em 3 tipos: padrões de criação, padrões estruturais e padrões • a) comportamentais. b) de testes. • c) de implantação. d) de análise. • e) de visualização. 252 253 Explicação 254 Questões para debate • Banca: FCC Órgão: TRT 4ª REGIÃO Prova: Analista • O catálogo de padrões de projeto (design patterns) do GoF contém a) 20 padrões e está basicamente dividido em duas seções: Structural e Behavioral. • b) 21 padrões e está basicamente dividido em duas seções: Creational e Behavioral. • c)23 padrões e está basicamente dividido em duas seções: Structural e Behavioral. 255 Questões para debate • d) 23 padrões e está, basicamente, dividido em três seções: Creational, Structural e Behavioral. • e) 24 padrões e está basicamente dividido em três seções: Creational, Spectral e Behavioral. 256 Explicação • São 23 padrões, temos os criacionais (5): Abstract Factory Factory Method Builder Prototype Singleton 257 Explicação • São 23 padrões, Os estruturais (7): Bridge; Decorator; Facade; Flyweight; Adapter; Proxy; Composite. 258 Explicação • São 23 padrões, os comportamentais (11): Chain of Responsability; Command; Visitor; Observer; Iterator; Strategy; Interpreter; State; Memento; Mediator; Template Method. 259 Questões para debate • Banca: FUMARC Órgão: PRODEMGE Prova: Analista • São padrões de projeto GoF (design patterns), EXCETO: a) Strategy. • b) Workfow. • c) Adapter. • d)Facade. 260 Questões para debate • Banca: FUMARC Órgão: PRODEMGE Prova: Analista • São padrões de projeto GoF (design patterns), EXCETO: a) Strategy. • b) Workfow. • c) Adapter. • d)Facade. 261 Questões para debate • Banca: FUMARC Órgão: PRODEMGE Prova: Analista • São padrões de projeto GoF (design patterns), EXCETO: a) Strategy. • b) Workfow. • c) Adapter. • d)Facade. 262 Explicação • Verificar a lista acima com os 23 tipos. 263 Questões para debate • Banca: CESPE Órgão: TRT Prova: Tecnologia • Considerando os padrões definidos pelo GoF (Gang of Four), assinale a opção correta. • a) O padrão chain of responsibility é responsável por manter a independência entre os objetos receptor e solicitante na orientação a objetos. • b) O padrão flyweight é utilizado quando é desejável que uma interface (abstração) possa variar independentemente de suas implementações. • c) 264 Questões para debate • c) Os padrões GoF estão divididos nas categorias projetos de criação, projetos estruturais e projetos de transição. • d) Os padrões abstract factory e singleton fazem parte da categoria projetosestruturais. • 265 Explicação • https://brizeno.wordpress.com/padroes/ 266 Questões para debate • Banca: INSTITUTO AOCP Órgão: MPEBA Prova: Analista • Nos padrões GoF, o padrão Builder é constituído, dentre os seus elementos, do “builder” e “concrete builder”. A diferença entre eles, respectivamente, é dada por qual alternativa? • a) O primeiro especifica uma interface para um construtor de partes do objetoproduto, enquanto que o segundo constrói um objeto utilizando a interface do builder. 267 Questões para debate • b) O primeiro constrói um objeto utilizando a interface do concrete builder, enquanto que o segundo especifica uma interface para um construtor de partes do objetoproduto. • c) O primeiro especifica uma interface para um construtor de partes do objetoproduto, enquanto que o segundo define uma implementação da interface builder além de manter a representação que cria e fornece a interface para recuperação do produto. 268 Questões para debate • d) O primeiro representa o objeto complexo acabado de construir e inclui classes que definem as partes constituintes, enquanto que o segundo especifica uma interface para um construtor de partes do objetoproduto. • e) O primeiro define uma implementação da interface builder além de manter a representação que cria e fornece a interface para recuperação do produto, enquanto que o segundo representa o objeto complexo acabado de construir e inclui classes que definem as partes constituintes. 269 Questões para debate • b) O primeiro constrói um objeto utilizando a interface do concrete builder, enquanto que o segundo especifica uma interface para um construtor de partes do objetoproduto. • c) O primeiro especifica uma interface para um construtor de partes do objetoproduto, enquanto que o segundo define uma implementação da interface builder além de manter a representação que cria e fornece a interface para recuperação do produto. 270 Padrões de Projetos de Software . Dentre as alternativas abaixo identifique a que NÃO define uma situação em que deve ser utilizado o padrão Factory Method? a)Quando uma classe quer que suas subclasses especifiquem os objetos criados. b)Quando o algoritmo de criação de um objeto deve ser independente das suas partes constituintes e da maneira como ele é "montado". c) Quando uma classe (o criador) não pode antecipar a classe dos objetos que deve criar. d)Quando se quer localizar num ponto único a conhecimento de qual subclasse está sendo usada. e)Quando classes delegam responsabilidade para uma entre várias subclasses de apoio. Questão 1 271 Padrões de Projetos de Software . Dentre as alternativas abaixo identifique a que NÃO define uma situação em que deve ser utilizado o padrão Factory Method? a)Quando uma classe quer que suas subclasses especifiquem os objetos criados. b)Quando o algoritmo de criação de um objeto deve ser independente das suas partes constituintes e da maneira como ele é "montado". c) Quando uma classe (o criador) não pode antecipar a classe dos objetos que deve criar. d)Quando se quer localizar num ponto único a conhecimento de qual subclasse está sendo usada. e)Quando classes delegam responsabilidade para uma entre várias subclasses de apoio. Questão 1 – Resposta 272 Padrões de Projetos de Software Considerando os padrões de Criação ou de Construção do GoF, analise o modelo abaixo e em seguida marque a alternativa que define a representação. a) MEDIATOR. b) BUILDER. c) FACADE. d) SINGLETON. e) FACTORY METHOD. Questão 2 . 273 Padrões de Projetos de Software Considerando os padrões de Criação ou de Construção do GoF, analise o modelo abaixo e em seguida marque a alternativa que define a representação. a) MEDIATOR. b) BUILDER. c) FACADE. d) SINGLETON. e) FACTORY METHOD. Questão 2 – Resposta . 274 Padrões de Projetos de Software Considerando os padrões de Criação ou de Construção do GoF, analise o modelo abaixo e em seguida marque a alternativa que define a representação. a) Mediator. b) Singleton. c) Factory Method. d) Facade. e) Builder. Questão 3 . 275 Padrões de Projetos de Software Considerando os padrões de Criação ou de Construção do GoF, analise o modelo abaixo e em seguida marque a alternativa que define a representação. a) Mediator. b) Singleton. c) Factory Method. d) Facade. e) Builder. Questão 3 – Resposta . 276 Padrões de Projetos de Software . A família de padrões GoF é dividida em três grupos principais de padrões, a saber: a) Padrões de Criação; Padrões Metodológicos; Padrões de Ponte. b) Padrões de Processo; Padrões de Singularidade; Padrões de Prototipação. c) Padrões de Proxy; Padrões de Criação; Padrões de Encadeamento. d) Padrões Estruturais; Padrões de Processo; Padrões de Responsabilidade. e) Padrões Comportamentais; Padrões de Criação; Padrões Estruturais. Questão 4 277 Padrões de Projetos de Software . A família de padrões GoF é dividida em três grupos principais de padrões, a saber: a) Padrões de Criação; Padrões Metodológicos; Padrões de Ponte. b) Padrões de Processo; Padrões de Singularidade; Padrões de Prototipação. c) Padrões de Proxy; Padrões de Criação; Padrões de Encadeamento. d) Padrões Estruturais; Padrões de Processo; Padrões de Responsabilidade. e) Padrões Comportamentais; Padrões de Criação; Padrões Estruturais. Questão 4 – Resposta 278 Padrões de Projetos de Software Baseando-se nas necessidades apresentadas do lado direito do quadro abaixo, relacione-as ao padrão adequado a utilização e, em seguida marque a alternativa que corresponde a sequência numerada correspondente. a) 4 - 2 - 1 - 3 b) 4 - 3 - 1 - 2 c) 2 - 3 - 4 - 1 d) 4 - 1 - 2 - 3 e) 3 - 4 - 1 - 2 Questão 5 . 279 Padrões de Projetos de Software Baseando-se nas necessidades apresentadas do lado direito do quadro abaixo, relacione-as ao padrão adequado a utilização e, em seguida marque a alternativa que corresponde a sequência numerada correspondente. a) 4 - 2 - 1 - 3 b) 4 - 3 - 1 - 2 c) 2 - 3 - 4 - 1 d) 4 - 1 - 2 - 3 e) 3 - 4 - 1 - 2 Questão 5 – Resposta . 280 Padrões de Projetos de Software . Ter uma baixa coesão nos objetos do sistema pode gerar difícil compreensão e reutilização, além de afetar a manutenibilidade. Nesse contexto, o que é ter baixa coesão? Questão 6 281 Padrões de Projetos de Software . Ter uma baixa coesão nos objetos do sistema pode gerar difícil compreensão e reutilização, além de afetar a manutenibilidade. Nesse contexto, o que é ter baixa coesão? É quando se tem uma mesma classe executando muitos trabalhos, realizando muitas coisas não relacionadas. Questão 6 – Resposta 282 Padrões de Projetos de Software . • Considere as seguintes assertivas sobre as vantagens do uso de Padrões de • Projeto (Design Patterns): I. Padrões de projeto proporcionam um vocabulário comum de projeto, facilitando comunicação, documentação e aprendizado dos sistemas de software. II. Padrões de projeto auxiliam no desenvolvimento de software por meio da • reutilização do projeto de soluções computacionais já testadas e aprovadas. III. Uma biblioteca de padrões pode ajudar a melhorar e padronizar o desenvolvimento de software. • As assertivas corretas são: a) somente I e III. b) somente II e III. c) somente I e II. d) I, II e III. e) somente II. Questão 7 283 Padrões de Projetos de Software . • Considere as seguintes assertivas sobre as vantagens do uso de Padrões de • Projeto (Design Patterns): I. Padrões de projeto proporcionam um vocabulário comum de projeto, facilitando comunicação, documentação e aprendizado dos sistemas de software.II. Padrões de projeto auxiliam no desenvolvimento de software por meio da • reutilização do projeto de soluções computacionais já testadas e aprovadas. III. Uma biblioteca de padrões pode ajudar a melhorar e padronizar o desenvolvimento de software. • As assertivas corretas são: a) somente I e III. b) somente II e III. c) somente I e II. d) I, II e III. e) somente II. Questão 7 284 Padrões de Projetos de Software . O uso de classes "statics" garante que somente uma instância estará em memória e que a destruição pelo "garbage collection" será mais rápida do que o uso do padrão singleton. Por que então devemos usar o padrão singleton? Questão 8 285 Padrões de Projetos de Software . O uso de classes "statics" garante que somente uma instância estará em memória e que a destruição pelo "garbage collection" será mais rápida do que o uso do padrão singleton. Por que então devemos usar o padrão singleton? Porque uma classe static SEMPRE é carregada na memória quando a aplicação é executada e a classe SINGLETON não, sendo carregada na memória quando solicitada a primeira instância. Questão 8 – Resposta 286 Padrões de Projetos de Software . Sobre padrões de projeto escolha a opção INCORRETA: a)Padrões de projeto estão relacionados a diferentes níveis de abstração no desenvolvimento de aplicações orientadas a objetos, podendo aparecer ao longo de todo ciclo de análise e projeto de um sistema. b)A diversidade de padrões disponíveis é bastante grande, pode-se ter, por exemplo, padrões arquiteturais, padrões de análise, padrões de projeto e padrões de código. c)Cada padrão descreve um problema que ocorrem repetidas vezes em nosso ambiente e fornece o núcleo da solução para aquele problema, de tal maneira que se pode usar essa solução milhões de vezes sem nunca fazê-la da mesma forma. d)Os padrões de projeto são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico de design em um contexto específico. e)Um padrão de projeto define uma estrutura que obrigatoriamente não poderá ser alterada pelo desenvolvedor. Questão 9 287 Padrões de Projetos de Software . Sobre padrões de projeto escolha a opção INCORRETA: a)Padrões de projeto estão relacionados a diferentes níveis de abstração no desenvolvimento de aplicações orientadas a objetos, podendo aparecer ao longo de todo ciclo de análise e projeto de um sistema. b)A diversidade de padrões disponíveis é bastante grande, pode-se ter, por exemplo, padrões arquiteturais, padrões de análise, padrões de projeto e padrões de código. c)Cada padrão descreve um problema que ocorrem repetidas vezes em nosso ambiente e fornece o núcleo da solução para aquele problema, de tal maneira que se pode usar essa solução milhões de vezes sem nunca fazê-la da mesma forma. d)Os padrões de projeto são descrições de objetos que se comunicam e classes que são customizadas para resolver um problema genérico de design em um contexto específico. e)Um padrão de projeto define uma estrutura que obrigatoriamente não poderá ser alterada pelo desenvolvedor. Questão 9 288 Padrões de Projetos de Software . Os métodos polimórficos utilizam os conceitos de overloading e overrinding. Apresente a diferença entre os dois conceitos. Questão 10 289 Padrões de Projetos de Software . Os métodos polimórficos utilizam os conceitos de overloading e overrinding. Apresente a diferença entre os dois conceitos. Overloading: Sobrecarga de Método. Reescrever o método com uma nova assinatura (atributos de entrada) Overriding: Sobrescrita de Método. Reescrever o método na classe filho (especialista), mesmo que ele já tenha sido implementada na classe mãe (generalista), com propósitos específicos para tal. Questão 10 – Resposta 290 Padrões de Projetos de Software . Segundo Metsker, o padrão de projeto GoF _ é aplicado para substituir a geração de instâncias não-inicializadas de uma classe, fornecendo novos objetos a partir de uma classe-exemplo. a) MEDIATOR. b) SINGLETON. c) PROTOTYPE. d) BUILDER. e) FACTORY METHOD. Questão 11 291 Padrões de Projetos de Software . Segundo Metsker, o padrão de projeto GoF _ é aplicado para substituir a geração de instâncias não-inicializadas de uma classe, fornecendo novos objetos a partir de uma classe-exemplo. a) MEDIATOR. b) SINGLETON. c) PROTOTYPE. d) BUILDER. e) FACTORY METHOD. Questão 11 – Resposta 292 Padrões de Projetos de Software . Assinale a afirmativa correta sobre o padrão Builder: a)Deve-se é separar no construtor da própria classe a lógica para criação de um objeto e concentrar a lógica de criação em uma hierarquia de herança. b)é uma abordagem que não facilita a criação de objetos com diferentes configurações e representações, tornando o código dependente a complexidade das classes relacionadas. c)Um dos principais objetivos do padrão Builder é separar o algoritmo de criação de um objeto complexo tanto da especificação, quanto das partes que o compõem. d)A legibilidade da solução final, ou seja, para entender como um objeto é criado e sob quais condições, fica comprometida. e)Deve-se é embutir no construtor da própria classe a lógica para criação de um objeto ou ainda distribuir a lógica de criação em vários métodos adicionais. Questão 12 293 Padrões de Projetos de Software . Assinale a afirmativa correta sobre o padrão Builder: a)Deve-se é separar no construtor da própria classe a lógica para criação de um objeto e concentrar a lógica de criação em uma hierarquia de herança. b)é uma abordagem que não facilita a criação de objetos com diferentes configurações e representações, tornando o código dependente a complexidade das classes relacionadas. c)Um dos principais objetivos do padrão Builder é separar o algoritmo de criação de um objeto complexo tanto da especificação, quanto das partes que o compõem. d)A legibilidade da solução final, ou seja, para entender como um objeto é criado e sob quais condições, fica comprometida. e)Deve-se é embutir no construtor da própria classe a lógica para criação de um objeto ou ainda distribuir a lógica de criação em vários métodos adicionais. Questão 12 294 Padrões de Projetos de Software . • Em padrão de projeto existe uma situação onde uma classe chama um método abstrato especificado em alguma classe abstrata (ou interface) e a subclasse concreta vai decidir que tipo exato de objeto criar e retornar. • Baseado nessa descrição marque a alternativa que aponta o padrão relacionado. a) Singleton. b) Builder. c) Mediator. d) Factory Method. e) Facade. Questão 13 295 Padrões de Projetos de Software . • Em padrão de projeto existe uma situação onde uma classe chama um método abstrato especificado em alguma classe abstrata (ou interface) e a subclasse concreta vai decidir que tipo exato de objeto criar e retornar. • Baseado nessa descrição marque a alternativa que aponta o padrão relacionado. a) Singleton. b) Builder. c) Mediator. d)Factory Method. e) Facade. Questão 13 296 Padrões de Projetos de Software . Uma classe com alto acoplamento faz com que o reuso fique comprometido. Apresente uma justificativa para esse problema. Questão 14 297 Padrões de Projetos de Software . Uma classe com alto acoplamento faz com que o reuso fique comprometido. Apresente uma justificativa para esse problema. O problema ocorre pois para reaproveitar métodos acoplados torna-se necessária a presença adicional das classes relacionadas, dificultando o processo de reutilização. Questão 14 – Resposta 298 • Ao término desta Unidade você deverá ser capaz de explanar sobre: Motivações para