Baixe o app para aproveitar ainda mais
Prévia do material em texto
PADRÕES DE PROJETO DE SOFTWARE Aula Revisão – Padrões estruturais GoF PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE O que veremos nesta terceira aula Revisão para AV1 PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE 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. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE 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 engenharia de 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 PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE 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 PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE 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 PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE 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) PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Catálogo - GoF PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Classificação dos 23 padrões segundo GoF* PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Padrões de Criação • fornecem um guia de como instanciar objetos. Esta ação normalmente envolve decisões dinâmicas para escolher, por exemplo, qual classe instanciar ou a quais objetos delegar responsabilidade. Esse padrão nos mostra como estruturar e encapsular essas decisões. Há cinco padrões de criação GoF: Abstract Factory, Builder, Factory Method, Prototype e Singleton. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE 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] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Definir uma interface ou classe abstrata para a criação de um objeto, permitindo decidir qual das implementações ou subclasses devem ser instanciadas; deixa uma classe deferir instanciação para subclasses [Gamma et al, 1994]. • Retornar uma instância dentre muitas possíveis classes, dependendo dos dados providos a ele [Destro, 2004]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Útil para se construir objetos individuais, para um propósito específico, sem que a construção requeira conhecimento das classes específicas sendo instanciadas [Destro, 2004]. • Uma classe de abstração é criada, contendo um método em que decide qual das opções de classe retornar. Então, apenas este método é invocado, sem conhecer a classe que será retornada por ele [Destro, 2004]. Por isso, este padrão é chamado de Factory Method (traduzindo: “método-fábrica”): um método é responsável pela “fabricação” de um objeto [Gamma et al, 1994]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Quando uma classe não pode antecipar ou conhecer a classe dos objetos que deve criar; • Quando uma classe quer suas subclasses para especificar os objetos que cria; • Quando classes delegam responsabilidade à alguma das várias subclasses ajudantes, e deseja-se localizar qual é a subclasse ajudante acessada. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Elimina a necessidade de acoplar classes específicas para aplicação em nível de código [Gamma et al, 1994] – na programação, lida-se apenas com a superclasse ou interface, para conhecer os métodos e atributos de uma forma genérica, o que permite manipular as subclasses ou implementações de maneira particular. • Dá maior flexibilidade para as classes – criar objetos numa classe que possui o “método-fábrica” é sempre mais flexível que fazê-lo em separado, assim o “método-fábrica” funciona como uma conexão para que uma das subclasses possa prover uma versão estendida de um objeto. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Desvantagens • Em alguns casos, pode ser criada uma relação superclasse-subclasse para a criação de classes que suportam o “método-fábrica”, e de acordo com a classe a ser criada, uma das várias subclasses podem sobrescrever o “método-fábrica”, a fim de conectar hierarquias de classes paralelas e fornecer maior portabilidade [Gamma et al, 1994]. Entretanto, esta é uma solução viável se, e somente se, a especialização da classe do método fábrica não for estritamente necessário (como no caso de um número elevado de implementações diferentes para o “método-fábrica”). Caso contrário, a relação custo-planejamento-implementação de se especializar uma classe apenas para instanciar um objeto de uma subclasse de outra superclasse pode se revelar bastante improdutiva, podendo-se optar por uma alternativa mais simples como a criação classes para o “método- fábrica” em separado PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • Sistema de consulta de veículos: informa-se qual carro se deseja consultar, então as informações dele são exibidas (adaptado [Destro, 2004]). PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Continuação Exemplo • A classe Principal, ilustrada na Figura 2, é a classe Java que inicializa a execução do aplicativo. PrincipalFrame é a interface de entrada e em CarroFrame as opções de consulta são exibidas. Selecionada a opção, o “método-fábrica” de CarroFactory é invocado (é um método estático, o que dispensa a instanciação da classe à qual pertence). A opção escolhida em CarroFrame é passada como parâmetro na invocação do “método-fábrica”, o que lhe permite identificar qual subclasse de Carro deve ser instanciada (Gol, Golf, Vectra ou Ômega), contendo as informações a serem consultadas, como combustível e preço. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Abstract Factory "Prover uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Prover interfaces ou superclasses para a criação de objetos relacionados ou dependentes, sem especificar a sua classe concreta ou implementação [Gamma et al, 1994]. • Retornar uma dasmuitas classes de objetos relacionadas, onde cada uma delas pode retornar diferentes objetos quando requisitados [Destro, 2004]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Usada na criação de famílias de classes dependentes de uma interface ou superclasse, com a estrutura básica do padrão Factory Method para fazer o relacionamento entre as classes dependentes as suas respectivas superclasses ou interfaces. • Da mesma maneira em que aparece no Factory Method, uma classe é criada contendo um método que decide qual das opções de classes de domínio retornar; entretanto não serão as classes simples a serem escolhidas como opções, mas sim as famílias dessas classes, nas quais, pode-se optar por quais classes internas a cada uma dessas famílias se quer retornar. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Em resumo, um nível maior de abstração é criado [Destro, 2004]: não se escolhe a classe de retorno dentro de uma família. Opta-se por uma das classes de retorno e a sua família é automaticamente retornada. Ou seja, com base nos parâmetros de retorno, uma classe é buscada dentro de uma das famílias disponíveis, sem conhecer as estruturas de relacionamento entre as classes e suas famílias. • Por isso, o método tem o nome de Abstract Factory (“fábrica abstrata”), pois pode atuar como uma fábrica de objetos genérica, recebendo um grupo qualquer de objetos relacionados, que serão criados de maneira transparente ao seu relacionamento. • PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Situações em que um sistema deve ser independente da maneira como seus produtos são criados, relacionados e representados; • Quando é necessária uma configuração utilizando uma das várias famílias de produtos; • No projeto de produtos que devem ser, obrigatoriamente, agrupados em famílias e seu uso é inerente a essa condição; • No fornecimento de uma biblioteca de classes de produtos, e deve- se revelar apenas suas interfaces ou superclasses, e não suas implementações ou subclasses. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • Super1: é a classe abstrata (ou superclasse) dos objetos integrantes das famílias. • Super2: é a classe abstrata (ou superclasse) dos objetos representantes das famílias. • Sub[1..4]: representam as diferentes classes sobre as quais se deve decidir instanciar, normalmente indicados como produtos. • Sub[5,6]: representam as famílias, ou seja, classes que possuem determinados produtos relacionados de maneira intrínseca à elas. • AbstractFactory: nesta classe reside o método decisório, que avalia o parâmetro passado na sua invocação, para buscar um determinado produto ou objeto, dentro das famílias, representadas por Sub5 e Sub6; ou seja representa a “fábrica abstrata”. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Isola as classes concretas (subclasses ou implementações) das suas famílias e da “fábrica abstrata”, dessa maneira pode-se criar produtos e associa-los à família mais apropriada, além de poder acessá-lo através da “fábrica abstrata” de forma transparente e independente aos clientes do sistema; • Maior agilidade para alternar entre diferentes famílias de produtos: é possível alternar entre diferentes famílias de produtos numa aplicação, independente do número de produtos de cada família, pois a “fábrica de produtos” cria uma família de produtos por completo, podendo-se em seguida utilizar um ou vários produtos dessa família. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Maior segurança para trabalhar com produtos de uma mesma família: como a classe “fábrica abstrata” é instanciada uma única vez, assegura-se ao cliente da aplicação que se trabalhe com apenas uma família de produtos por vez, pois uma “fábrica abstrata” pode alternar entre várias famílias de produtos, mas cria apenas uma destas famílias por vez. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Desvantagens • O suporte a novos tipos de produtos se torna mais complicado [Gamma, et al 1994], pois a “fábrica abstrata” somente suporta famílias de produtos, ou seja, para a criação de novos produtos duas alternativas de projeto podem ser seguidas: ◦A criação de uma família para suportar o novo produto, o que pode ser altamente desfavorável no caso de um número reduzido de novos produtos por família criada. • A adaptação da “fábrica abstrata” para suportar um “produto-solo”, que não integra nenhuma das famílias disponíveis; entretanto isso implica na modificação da “fábrica abstrata” e na inutilização da estrutura das famílias, o que descaracterizaria este padrão. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Desvantagens • A interface gráfica, quando houver, deverá ser criada de maneira a receber os produtos de forma genérica, o que cria impedimentos para o tratamento gráfico especializado dos produtos pela aplicação, pois esta não deve saber qual dos produtos receberá. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Continuação Exemplo • Carro e suas subclasses (Golf, Gol, Vectra e Omega), são provenientes da estrutrura do Padrão Factory Method, que é parte integrante de Abstract Factory. Fabricante tem o mesmo papel para Volksvagen e Chevrolet do que Carro para suas respectivas subclasses. • A classe Principal é a classe Java que inicializa a execução do aplicativo. PrincipalFrame é a interface de entrada e em FabricanteFrame as opções de consulta são exibidas. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Continuação Exemplo • Selecionada a opção, FabricanteFactory, a “fábrica abstrata”, é instanciada. A opção escolhida em FabricanteFrame é passada como parâmetro para a seleção do produto a ser instanciado, assim como sua família, contendo as informações a serem consultadas. As famílias correspondem aos fabricantes (Volkswagen e Chevrolet) e os produtos aos carros (Gol, Golf, Vectra ou Ômega); cada família conta com dois produtos (Volkswagen: Gol e Golf, Chevrolet: Vectra e Ômega). FabricanteFactory conhece apenas a interface das famílias e esta, por sua vez, conhece apenas a interface dos produtos. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Continuação Exemplo • Essas características acarretam algumas utilizações recorrentes de outros padrões em AbstratctFactory: • Como a “fábrica abstrata” deve ser instanciada somente uma vez, ela é criada como um Singleton; • Para escolher os produtos, cada família conta com um “método fábrica”, pois conhece apenas a superclasse ou interface dos produtos e não suas implementações ou subclasses, o que denota a utilização do padrão Factory Method; PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Builder "Separar a construção de um objeto complexo de sua representação para que o mesmo processo de construção possa criar representações diferentes." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Separar a construção de um objeto de sua respectiva representação, e desta maneira, a partir dessa mesma construção, produzir representações diferentes [Gamma, et al, 1994]. • Mover a lógica de construção de uma classe para um objeto externo, a fim de reduzir a complexidade da mesma e permitir a construção gradual de objetos-alvo a partir dessa classe [Metsker, 2004]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Nem sempre é fácil coletar os requisitos que movem a criação de uma classe. Mais trabalhoso é, porém, instanciar objetos de uma classe que variem de acordo com os requisitos apresentados.Por exemplo, mudar o layout de uma tela, em tempo de execução, quando o usuário seleciona uma opção condizente. • Mas, se fosse possível separar da classe os seus métodos – representam o comportamento e a construção dessa classe – numa estrutura de dados a parte, seria possível também, utilizar essa estrutura para coletar as opções de um cliente e construir objetos diferentes, conhecendo apenas os parâmetros necessários para esta construção, provenientes dos atributos que compõem a classe em questão. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Desta maneira se apresenta o padrão Builder, um construtor de objetos, baseado nos métodos de criação e comportamento de uma classe, que pode instanciar objetos diferentes, conhecendo apenas os atributos que compõem a classe em questão. • Isto é um pouco mais do que uma classe Factory, pois não retornam objetos que são simplesmente descendentes de uma base, mas que podem ser totalmente diferentes uns dos outros (por exemplo: telas diferentes). Builder constrói um número de objetos, de vários modos, dependendo dos dados recebidos [Destro, 2004]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Para tal finalidade deve-se separar os atributos (que permanecem residindo na estrutura da classe) dos seus métodos (que passam a integrar objetos em separado) [Destro, 2004], para que o corpo de métodos funcione como um “captador” de dados, e a classe como um “receptor”, para instanciar um novo objeto, de acordo com o que for recebido. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Quando o algoritmo de criação de um objeto deve ser independente das suas partes constituintes e da maneira como ele é “montado”; • Para que o processo de construção permita diferentes representações para o objeto que está sendo construído; • Na simplificação de um objeto complexo, separando a sua “construção” da sua “constituição”; PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • uilder : é a interface ou superclasse que contém os métodos e atributos a serem redefinidos. Ela oferece a “parte” da classe que deve ser comum às construções que vão se seguir. • ub [n]: são as diversas construções (ou construtores) que podem ser obtidas a partir de Builder, estas classes contém a definição do comportamento e dos atributos que são desejáveis aos produtos provenientes das aplicações que implementam este padrão. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • roduto : é o elemento que os construtores Sub[n] podem gerar, podendo ser de um tipo único, ou podem ser diferenciados, de acordo com a construção que lhe é inerente. O mais interessante – e o que diferencia o padrão Builder do Abstract Factory – é que Produto não precisa ser uma instância das classes Sub[n]: pode se tratar de um objeto à parte, sem nenhuma relação classe-objeto com Sub[n] ou mesmo com a classe Builder. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens •Redução da extensão e da complexidade de uma classe; •Independência entre a representação de um objeto e a sua construção; •Criação de regras graduais de construção para um objeto; •Geração de construções diversificadas de um tipo de objeto, ou de construções de objetos diversificados entre si, a partir de um construtor-base; PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Desvantagens •Por ser bastante flexível, este padrão só apresentará desvantagem se o seu construtor-base for mal planejado, o que poderia resultar em construções redundantes ou com baixo aproveitamento operacional. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • Emissão de ordens de produção, baseadas em políticas de produção variadas (adaptado [Metsker, 2004]). • Numa montadora de veículos, o processo de montagem de veículos é organizado com base em quatro parâmetros específicos: modelo (qual carro será produzido), custo unitário (custo de produção de cada carro), quantidade (de modelos a ser produzida) e data de entrega. Esses parâmetros representam um documento: a ordem de produção que orienta o processo de montagem dos veículos. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • essa montadora, trabalha-se com o conceito de políticas de produção: a maneira como se pode estabelecer regras para aceitar ou não uma ordem de produção; são duas: • ormal: não aceita alterações na ordem de produção, se ela não atende aos requisitos mínimos. • lexível: caso o número de carros e/ou o custo de produção sejam inferiores ao mínimo estabelecido, eles são ajustados para que a ordem de produção seja aceita. • penas se deve notar que não cabem ajustes aos parâmetros data (que deve PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • essa montadora, trabalha-se com o conceito de políticas de produção: a maneira como se pode estabelecer regras para aceitar ou não uma ordem de produção; são duas: • ormal: não aceita alterações na ordem de produção, se ela não atende aos requisitos mínimos. • lexível: caso o número de carros e/ou o custo de produção sejam inferiores ao mínimo estabelecido, eles são ajustados para que a ordem de produção seja aceita. • penas se deve notar que não cabem ajustes aos parâmetros data (que deve PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • interface OPConstantes apenas disponibiliza constantes que são utilizadas de maneira recorrente na aplicação, de maneira que podem ser acessadas pelas classes que a implementam. • classe Principal, ilustrada na Figura 2, inicializa o aplicativo e PrincipalFrame é a interface de entrada do sistema. Em BuilderFrame é apresentada a tela para a inserção de parâmetros. OPAnalisador analisa os parâmetros e só permite a criação da ordem de produção se data e modelo estiverem corretos, e conforme a política escolhida, instancia um dos construtores de ordem de produção, que por sua vez criam uma ordem de produção, que pode ser cadastrada ou não, conforme a maneira como cada construtor cria a ordem de produção analisando os parâmetros recebidos PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • PBuilder é a superclasse que disponibiliza para suas “classes-filho” as características comuns de uma ordem de produção (quantidade de carros, valor unitário, etc.). OPBuilderInflex e OPBuilderFlex correspondem, respectivamente à construção da ordem de serviço apenas com parâmetros completos e com alguns dos parâmetros ausentes, dependendo do parâmetro passado em BuilderFrame, pelo usuário PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Prototype "Especificar os tipos de objetos a serem criados usando uma instância como protótipo e criar novos objetos ao copiar este protótipo." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito •Especificar os tipos de objetos a serem criados, usando uma instância prototípica, criando novos objetos através da cópia desse protótipo [Gamma et al, 1994]. •Substituir a geração de instâncias não-inicializadas de uma classe, fornecendo novos objetos a partir de uma classe-exemplo [Metsker, 2004]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • criação de classes se faz mais simples quando é possível partir de um exemplo, para então criar as especializações condizentes com as necessidades do domínio da aplicação. • ma alternativa é criar classes especializadas que herdem, ou seja, que sejam subclasses, de uma classe com atributos e métodos mais genéricos (ou até mesmo uma classe abstrata)com parâmetros de visibilidade acessíveis, alterando-os apenas quando for preciso na criação da classe especializada. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • ntretanto, essa alternativa apresenta um problema de ordem prática: a geração excessiva de classes especializadas (ou subclasses), para cada necessidade específica, pode “inchar” o sistema, fazendo com que essas classes sempre sejam carregadas, mesmo que o seu uso seja reduzido [Metsker, 2004]. • inda, tratando-se de visibilidade, para a criação de subclasses, estas devem conhecer a superclasse que lhes fornecerá as características comuns a elas, para que, então, sejam diferenciadas, segundo as necessidades de cada objeto. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • ara sistemas remotos, nem sempre isso é possível: na maioria das situações, um servidor de classes fica isolado dos clientes, e estes não podem conhecer a estrutura da superclasse; apenas podem saber dos parâmetros – a serem informados em chamadas de métodos – que participam da criação de produtos (que no caso, seriam as subclasses). • esse contexto, Prototype se dispõe a simplificar a criação de novas classes a partir de uma classe-exemplo, copiando-a fielmente, para que, nessa cópia, sejam feitas as especializações intrínsecas a cada dependência da aplicação. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • lém de reduzir sensivelmente o número de classes [Gamma et al, 1994], o uso desse padrão isola o usuário da estrutura do objeto, ou a classe- exemplo de seus produtos [Metsker, 2004] – o que ainda facilita a criação de novas classes-exemplo, quando for estritamente necessário. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Quando as classes para instanciação são especificadas em tempo de execução ou carregadas dinamicamente; • Para evitar a construção de uma hierarquia de classes-exemplo estritamente especializada ou demasiadamente ligada a um tipo de produto; • Quando as instâncias de uma classe podem ter apenas uma ou poucas maneiras de manifestar seu estado. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • Sub [1..4]: representam as diferentes classes-exemplo sobre as quais se deve decidir “copiar”. Elas implementarão uma interface com o método de clonagem, o que possibilita que a responsabilidade do método, e a decisão sobre “o que clonar”, fiquem isoladas. • InterfaceClonavel : interface Java que estende a classe Cloneable, ou seja, oferece um método de clonagem para ser redefinido (duplicate), com um tipo de retorno que será comum às classes que a implementarem. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes •Prototype : É a classe que propriamente “faz as cópias” dos elementos escolhidos; como o tipo de retorno é proveniente da implementação de uma interface padrão, o objeto dessa classe faz as cópias de maneira genérica, ou seja, sem conhecer o tipo de objeto que estará clonando. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Isolamento entre os produtos (subclasses ou implementações) e suas classes-exemplo [Metsker, 2004]; esta vantagem se dá por dois fatores: Facilita a criação de novas classes-exemplo – quando for devidamente necessário – menos acopladas, o que é apropriado para classes que diferem apenas em seus atributos, mas não em seus comportamentos [Gamma et al, 1994]; Fornece de forma transparente e independente acesso ao sistema, apenas pelo conhecimento dos parâmetros necessários para a criação das cópias, a partir das classes exemplo. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Redução do número de subclasses: as cópias podem suprir as especializações – sejam elas por herança ou por implementação de interfaces – pois uma vez criadas com um formato padrão, podem ser modificadas dentro de cada contexto e necessidade inerentes à aplicação. • Configuração para o carregamento dinâmico de novas classes: com este padrão, é possível configurar a instanciação de classes que originalmente não estavam ligadas ao programa, pois ao invés de invocar um construtor estático, dá suporte à criação de instâncias em tempo de execução, assim que sua respectiva classe é carregada [Gamma et al, 1994]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Desvantagens • única desvantagem encontrada foi a da utilização do método Clone: Este método cria uma cópia exata de um objeto que lhe for passado como parâmetro. Uma cópia exata carrega consigo uma espécie de “fotografia” do objeto: não apenas seu comportamento é “clonado”, mas também seu estado, ou seja, um novo objeto com os mesmos campos do objeto original [Metsker, 2004]; Entretanto, quando se quer copiar um objeto, quase sempre se deseja um “novo objeto” e não um “objeto novo”, o que significa uma cópia não-instanciada daquele objeto, ou com os campos ajustados para valores iniciais, que sejam default para toda a aplicação. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Desvantagens • ssim, o programador deve ter em mente esta diferença ao implementar este padrão, pois objetos clonados podem apresentar problemas de inclusão de classes não existentes e/ou referencias circulares (dependências de parâmetros ou resultados que sejam internos aos objetos e que não sejam levados em consideração na clonagem) [Gamma et al, 1994]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplos Linha de montagem de uma fábrica, onde um modelo de carro é especificado para a sua produção em série [Tadarguila, 2005]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • classe Principal, ilustrada na Figura 2 é a classe Java que inicializa a execução do aplicativo. PrincipalFrame é a interface de entrada e em PrototypeFrame as opções de produção são exibidas. • elecionadas as opções, a classe Prototype é instanciada por PrototypeFrame; esta classe recebe os parâmetros para a clonagem: modelo e número de unidades a serem produzidas a partir do modelo. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • instância de Protoytpe não sabe que classe de modelo será clonada, e nem como cada classe será clonada. Essas responsabilidades são inerentes às classes dos modelos (Gol, Golf, Vectra e Omega; Carro é apenas a superclasse para generalizar as características comuns dos veículos, ela não participa desse Padrão) – isso é feito pela maneira como essas classes implementam a interface CarroClonavel, que por sua vez, estende a classe nativa Cloneable que oferece um método genérico de cópia de objetos – garantindo que as classes-exemplos (ou seja, as classes dos modelos) não fiquem acopladas ao cliente (nesse caso, o objeto da classe Prototype requisita as cópias, com base nos parâmetros passados). PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • rototype aciona o método de clonagem, no objeto da classe-exemplo passado como parâmetro (isto significa o “modelo”) retornando um vetor dinâmico com o número de clones do modelo especificado. A classe Carro não participa do padrão, serve apenas como “classe-pai” das “classes- exemplo” (o que caracteriza classes com o mesmo comportamento, mas com atributos diferentes, já comentadas anteriormente) PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • ssas características acarretam algumas utilizações recorrentes de outros padrões em conjunto com Prototype: • Apesar de serem muito parecidos, e, de certa maneira, parecerem métodos concorrentes, Prototype e AbstractFactory podem ser usados em conjunto: uma “fábrica abstrata” podeter um conjunto de “protótipos”, dos quais pode obter cópias e retorna-las como produtos aos clientes [Gamma et al, 1994]; • Para a criação de interfaces gráficas – como em conjuntos de visualização e layout, por exemplo, um LookAndFeel Java – Prototype potencializa a produtividade dos padrões Composite e Decorator PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Singleton "Garantir que uma classe só tenha uma única instância, e prover um ponto de acesso global a ela." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Padrão de projeto simples que ilustra várias características necessárias aos padrões de projeto. Classificado criacional, pois está relacionado com processo de criação de objetos, possuindo inúmeras aplicações e implementação bastante direta. • Tem como propósito garantir a existência de uma instância única de uma classe específica, que possa ser acessada de maneira global e uniforme. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • O que motiva sua existência é que muitas aplicações necessitam garantir a ocorrência de uma instância de classes específicas, pois tais objetos podem fazer uso de recursos cuja utilização deve ser exclusiva, ou porque se deseja que os demais elementos do sistema compartilhem um único objeto particular. • Estas situações ocorrem quando vários subsistemas utilizam um único arquivo de configuração, permitindo sua modificação concorrente. Ou quando só se deve estabelecer uma conexão exclusiva com um banco de dados ou um sistema remoto, devendo ser compartilhado por várias tarefas paralelas; entre muitas outras. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Ao mesmo tempo não se quer que os usuários destas classes zelem por esta condição de unicidade, mas se deseja oferecer acesso simples à instância única que deverá existir, portanto se adiciona estas responsabilidades às classes que deverão constituir um Singleton. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Haver uma única instância de uma classe e esta deve ser acessada a partir de um ponto de acesso bem-conhecido • A instância única deve ser extensível através de subclasses e clientes podem usar instâncias diferentes polimorficamente, sem modificação de código. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • cesso controlado à instância única; • Singleton tem controle sobre como e quando clientes acessam a instância; • spaço de nomes reduzido; • Singleton é melhor que variáveis globais, já que as "globais" podem ser encapsuladas na instância única, deixando um único nome externo visível; • ermite refinamento de operações e de representação; • árias classes Singleton (relacionadas ou não via herança) podem obedecer a PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • exemplo (adaptado [Destro, 2004]) utiliza um campo privado e estático do tipo da própria classe para armazenar a referência da única instância permitida, o qual deve ser inicializado de modo a indicar a inexistência de tal instância. Um método estático, cujo tipo de retorno também é a própria classe, provê o ponto único de acesso a tal instância. • e a operação de instanciação ocorrer apenas na primeira solicitação de um objeto da classe, garante-se que a instância é única e ao mesmo tempo em que à criação só ocorrerá quando estritamente necessário (lazy instantiation). PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • Figura 3 ilustra a implementação do Padrão de Projeto Singleton. A classe DBConexao é destinada a fornecer uma conexão única para o Banco de Dados específico. Pelo uso desta classe pode-se reduzir a quantidade de recursos utilizados por uma aplicação durante o acesso ao banco de dados, garantindo uma única conexão. Apenas por meio do método “getConexao()” é possível obter a referência para a conexão única. Existe um método adicional “Shutdown()” criado para garantir que a conexão seja encerrada adequadamente. Note que são arbitrárias as definições de campos e métodos adicionais dentro de uma classe que pretende ser um Singleton, devendo atender aos requisitos específicos da aplicação. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • elo método “getConexao()” da classe DBConexao obtém uma conexão para o banco de dados (cujas strings referentes ao driver e url de conexão foram inclusas diretamente no código da classe). Por esta conexão, podem ser estabelecidas sessões com o banco de dados, o que permite a execução de comandos SQL e processamento dos resultados obtidos. Tentativas de novas conexões retornarão uma referência para o mesmo objeto, reduzindo a quantidade de recursos tomados do sistema. • través da classe BDTesteConexao é possível extrair os dados do BD, nesta classe encontra-se a SQL responsável pela busca dos dados. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • classe BDTela é responsável pela interface com o usuário, ela oferece os quatro botões para conexão e um para desconexão. Todos os botões para conexão têm a mesma finalidade, ou seja, conectar com o BD, mas caso já exista um driver carregado para aquele BD, o mesmo somente será atualizado. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Padrões Estruturais • definem caminhos comuns para a organização de diferentes tipos de objetos, facilitando sua integração e colaboração mutua. Há sete padrões estruturais GoF: ?? Bridge, Composite, Decorator, Facade, Flyweight e Proxy PADRÕES ESTRUTURAIS GOF – AULA RAV1 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 RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Agregar responsabilidades adicionais a um objeto dinamicamente. Classes decoradoras oferecem uma alternativa flexível ao uso de herança para estender uma funcionalidade [Silva, 2005]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Adicionar responsabilidades a um objeto, mas não à sua classe. Acontece, por exemplo, com criação de interfaces gráficas, quando se deseja acrescentar uma borda a um componente qualquer ou uma barra de rolagem a uma área de texto. Uma abordagem mais flexível é inserir o componente em outro objeto que adiciona a borda, um Decorator [Silva, 2005]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Utilizado para adicionar responsabilidades a objetos individuais de forma dinâmica e transparente, isto é, sem afetar outros objetos, da mesma forma, quando se quer retirar responsabilidades. • Quando a utilização de heranças para a implementação do mesmo afetará a flexibilidade do sistema [Allen & Bambara, 2003]. • Um caso de aplicação do Decorator é quando existem muitas variações de um objeto. Imagine por exemplo uma classe Janela com uma subclasse JanelaComBorda. Se houver a necessidade também de janelas com rolagem, tem-se ainda JanelaComRolagem e JanelaComBordaERolagem [Faerman, 2005], além de outras possíveis combinações, já que poderia haver menus, botões ou barra de status. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura • Esse padrão providencia que cada objeto Decorator contenha outro objeto Decorator. Nesse aspecto, um decorator é como um pequeno composite cujos elementos possuem cada qual um filho único. Diferentemente do padrão Composite, cujo propósito é compor objetos agregados, o propósito do Decoratoré compor comportamentos. • Estruturalmente, Figura 1, o padrão Decorator dispõe as classes em um hierarquia e distribui operações ao longo dela. Cada classe dessa hierarquia tipicamente tem um construtor que precisa de outra instância de uma classe dela. As classes Decorator tipicamente implementam suas operações por meio da dependência do objeto decorador que recebem em seus construtores [Metsker, 2004]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • Componente : define a interface para objetos que podem ter responsabilidades acrescentadas a eles dinamicamente. • ComponenteConcreto : define um objeto para o qual responsabilidades adicionais podem ser atribuídas • Decorator : mantém uma referência para um objeto Componente. Define uma interface que segue a interface de Componente. • DecoratorConcretoA e DecoratorConcretoB: acrescenta responsabilidades ao componente PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Fornece uma flexibilidade maior do que a herança estática. • ◦ Evita a necessidade de colocar classes sobrecarregadas de recursos em uma posição mais alta da hierarquia. • ◦ Simplifica a codificação permitindo que você desenvolva uma série de classes com funcionalidades específicas, em vez de codificar todo o comportamento no objeto. • ◦ Aprimora a extensibilidade do objeto, pois as alterações são feitas codificando novas classes. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplos PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplos • O exemplo ilustrado na Figura 21, visa gerar janelas com características que podem variar de uma janela para outra. Por exemplo, o cliente pode decidir entre construir uma janela com barra de menus ou não. Desta forma consegue-se aumentar o número de possibilidades de janelas diferentes apresentadas com um pequeno número de classes. • Neste exemplo, a interface Janela recebe o papel de ser o Componente da estrutura apresentada anteriormente. Por sua vez, JanelaComum interpreta o ComponenteConcreto, ou seja, é ele que receberá as modificações no decorrer da execução da aplicação. Como o próprio nome diz, o Decorator assume a finalidade do Decorator da estrutura padrão. JanelaMenuBar, JanelaBorda, JanelaBarraStatus e JanelaBarraFerramenta herdam de Decorator, ou seja, são os n decoradores concretos. PADRÕES ESTRUTURAIS GOF – AULA RAV1 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 RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Compõe objetos em estruturas do tipo árvore para representar hierarquias todo-parte. Faz também com que o tratamento dos objetos individuais e de suas composições seja uniforme. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Aplicações gráficas como editores de desenho e sistemas de captura de esquema deixam os usuários construírem diagramas complexos a partir de Componentes simples. O usuário pode agrupar Componentes para formar Componentes maiores, que, por sua vez, podem ser agrupados para formar Componentes maiores ainda. O Padrão Composite descreve como usar composição recursiva, de modo que os clientes não tenham que fazer distinção entre componentes simples e composições. . PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Quiser representar hierarquias parte-todo de objetos; • Deseja que os clientes sejam capazes de ignorar as diferenças entre composição de objetos e objetos individuais. Clientes tratarão todos os objetos uniformemente na estrutura Composite. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • Componente: • Declara a interface para objetos na composição; • Implementa comportamento default para interface comum a todas as classes, como apropriado; • Declara uma interface para acessar ou gerenciar seus Componentes filhos; • Folha: • Representa objetos folhas na composição. Uma folha não tem filhos; • Define comportamento para objetos primitivos na composição. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • Composição: • Define comportamento para Componentes que têm filhos; • Armazena Componentes filhos; • Implementa operações relacionadas com filhos na interface do Componente. • • Cliente: • Manipula objetos na composição através da interface Componente. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Define a consistência das hierarquias de classes de objetos primitivos e objetos composição. • Clientes podem tratar estruturas compostas e objetos individuais uniformemente. Clientes normalmente não sabem (e não deveriam se preocupar) se eles estão tratando com uma folha ou uma composição; • Torna mais fácil adicionar novos tipos de Componentes. Novas composições ou subclasses. Folhas trabalham automaticamente com estruturas existentes e código do cliente. Clientes não têm que ser mudados para novas classes de Componentes PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Desvantagens • Quando uma composição tem apenas alguns Componentes, você terá de usar uma checagem em tempo de execução para isto. PADRÕES ESTRUTURAIS GOF – AULA RAV1 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 RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • O principal objetivo do Adapter é facilitar a conversão da interface de uma classe para outra interface mais interessante para o cliente, fazendo com que várias classes possam trabalhar em conjunto independentemente das interfaces originais. Às vezes é preciso modificar uma classe que não pode ser alterada adequadamente devido à falta do código fonte (alguma biblioteca de classes comercial), ou por alguma outra razão. O Adapter é uma das formas de modificar classes nestas circunstâncias, sendo classificado com a de finalidade estrutural e abrange tanto escopo de classe quanto de objeto. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Uma classe já existente e sua interface não combinam com a esperada pelo cliente; • Se quer criar uma classe reutilizável que coopera com classes não relacionadas ou não previstas, isto é, classes que não necessariamente tenham interfaces compatíveis; • Se necessita usar várias subclasses existentes, mas é impraticável adaptar suas interfaces fazendo um Subclassing de cada uma PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Desejar usar uma classe existente e sua interface não corresponde ao que você precisa; • Desejar criar uma classe reutilizável que coopera com classes imprevistas ou não relacionáveis, isto é, classes que não tem necessariamente interfaces compatíveis PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • Cliente : Colabora entre os objetos conforme a interface Alvo. • Alvo : Define a interface de domínio específico que o Cliente utiliza. • Adaptador : Adapta a ClasseExistente para ser utilizada pela classe Alvo. • ClasseExistente : Define uma interface pré-existente que necessita ser adaptada. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Adapta o Adaptadorpara o Alvo através de uma classe concreta. Como consequência, uma classe adaptada não funcionará para adaptar uma classe e suas subclasses. • Deixa o Adaptador sobrepor algum comportamento do adaptado, desde que o Adaptador seja uma subclasse do adaptado. • Introduz um único objeto e nenhum ponteiro adicional é necessário para chegar ao adaptado PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • Usou-se como exemplo (adaptado [Software Design Patterns, 2005]), ilustrado na Figura 2, uma implementação que demonstra o uso de um banco de dados químico legado. Objetos da classe CompostoQuimico acessam o banco de dados através de uma interface que utiliza o Padrão Adapter. • CompostoQuímico : Define a interface de domínio específico que o cliente utiliza, ou seja, esta classe contém somente o que a classe Tela conhece. • Composto : Adapta a interface CompostoQuimico para ser utilizada pela classe BDQuimico, para posteriormente os dados sejam mostrados na tela. • BDQuimico : Define uma interface pré-existente que necessita ser adaptada, neste exemplo ela armazena os dados de cada composto químico, que são acessados e adaptados para a tela cliente. PADRÕES ESTRUTURAIS GOF – AULA RAV1 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 RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Desacopla uma abstração de sua implementação de maneira que ambas possam variar independentemente. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • O que motiva a utilização do padrão Bridge é a necessidade de um driver, permitindo implementações específicas para tratar objetos em diferentes meios persistentes. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando Usar • Quando for necessário evitar uma ligação permanente entre a interface e a implementação. • Quando alterações na implementação não puderem afetar clientes. • Quando implementações são compartilhadas entre objetos desconhecidos do cliente PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • Abstração : Define a interface de abstração. Mantém uma referência a um objeto do tipo Implementador. • AbstracãoRefinada : Estende a interface definida por Abstração. • Implementador : Define a interface para classes de implementação. Esta não tem a obrigação de corresponder exatamente à interface de abstração. De fato, as duas interfaces podem ser bastante diferentes. Tipicamente, a interface de implementação fornece apenas operações primitivas, cabendo à abstração a responsabilidade de definir operações de alto nível baseadas nestas primitivas. • ImplementadorConcretoA e implementadorComcretoB : Implementação concreta da interface definida por Implementador. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • Detalhes de implementação totalmente inacessíveis aos clientes. • Eliminação de dependências em tempo de compilação das implementações. • Implementação de abstração pode ser configurada em tempo de execução. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • A implementação (adaptado [Software Design Patterns, 2005]) do Padrão Bridge ilustra a Ponte entre a classe abstrata ObetoNegocios a ClienteDadosObjeto através de interface DadosObjeto. A interface DadosObjeto não é igual a ObjetoNegocios, já que não existe necessária dependência entre elas. • Este exemplo demonstra desacoplamento de uma abstração de ObjetoNegocio da implementação em DadosObjeto. As implementações de DadosObjeto podem evoluir dinamicamente sem propagar mudanças a nenhum dos objetos cliente, isso pode ser verificado na figura 2. • Na classe ClienteDadosObjeto encontra-se a implementação que a classe cliente espera através da DadosObjeto, neste caso, ela contém algumas pessoas cadastradas, ela pode adicionar novas pessoas em determinado grupo ou mostrá- las. Para interagir entre os cadastros utiliza-se o Padrão Iterator, que será detalhado nos próximos Padrões. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Proxy "Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando usar • antagens Transparência: mesma sintaxe usada na comunicação entre o cliente e sujeito real é usada no proxy Permite o tratamento inteligente dos dados no cliente Permite maior eficiência com caching no cliente • esvantagens Possível impacto na performance Transparência nem sempre é 100% (fatores externos como queda da rede podem tornar o proxy inoperante ou desatualizado) PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Problema • istema quer utilizar objeto real... • as ele não está disponível (remoto, inaccessível, ...) • olução: arranjar um intermediário que saiba se comunicar com ele eficientemente PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Façade "Oferecer uma interface única para um conjunto de interfaces de um subsistema. Façade define uma interface de nível mais elevado que torna o subsistema mais fácil de usar." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • ferecer uma interface única para um conjunto de interfaces de um subsistema. • efinir uma interface de nível mais elevado que torna o subsistema mais fácil de usar [Silva, 2005]. • eduzir a complexidade do relacionamento entre uma classe relativa ao cliente e as demais classes utilitárias [Junior, 2004]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • ma grande vantagem da programação orientada a objetos é que ela ajuda a evitar que as aplicações se tornem programas monolíticos, com pedaços incorrigivelmente entrelaçados. No entanto, a aplicabilidade variada das classes em um subsistema orientado a objetos pode oferecer uma variedade expressiva de opções [Metsker, 2004]. • xistem circunstâncias onde é necessário utilizar diversas classes diferentes para que uma tarefa possa ser completada, caracterizando uma situação onde uma classe cliente necessita utilizar objetos de um conjunto específico de classes utilitárias que, em conjunto, compõem um subsistema particular ou que representam o acesso a diversos subsistemas distintos PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando usar? • riação de interfaces mais simples para um ou mais subsistemas complexos. • edução de dependência entre o cliente e as classes existentes nos subsistemas, ocasionando a redução da coesão do sistema • riação de sistemas em camadas. Este padrão provê o ponto de entrada para cada camada (nível) do subsistema. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • rotege os clientes da complexidade dos componentes do subsistema; • romove acoplamento fraco entre o subsistema e seus clientes; • eduz dependências de compilação, possivelmente complexas ou circulares; • acilita a portabilidade do sistema [Junior, 2004]; • eduz a união entre subsistemas desde que cada subsistema utilize seu próprio padrão Facade e outras partes do sistema utilizem o padrão Facade para comunicar-se com o subsistema [Allen e Bambara 2003]; PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Flyweight "Usar compartilhamento para suportar grandes quantidades de objetos refinados eficientemente." [GoF]PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Prós e contras • uando usar Flyweight Quando o tamanho do conjunto de objetos for significativamente menor que a quantidade de vezes em que eles são usados na aplicação Quando objetos podem ser usados em diferentes contextos ao mesmo tempo (agindo sempre como um objeto independente) • uando não usar Quando o estado dos objetos não for imutável (é preciso passar o estado mutável como parâmetro e isto pode ser impraticável se o estado consistir de vários objetos) Quando for necessário elaborar um algoritmo ou algo complicado para PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Problema PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Padrões Comportamentais • são projetados para organizar, gerenciar e combinar diferentes comportamentos. Há 11 padrões comportamentais GoF: Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method e Visitor. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Interpreter "Dada uma linguagem, definir uma representação para sua gramática junto com um interpretador que usa a representação para interpretar sentenças na linguagem.“ [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Interpreter • Descreve como projetar um conjunto de classes para representar e interpretar uma gramática para linguagens simples • Sua aplicação é recomenda naquelas situações em que há necessidade de interpretar uma linguagem qualquer e ao mesmo tempo quando se quer representar sentenças da linguagem como árvores abstratas sintáticas PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Template Method "Definir o esqueleto de um algoritmo dentro de uma operação, deixando alguns passos a serem preenchidos pelas subclasses. Template Method permite que suas subclasses redefinam certos passos de um algoritmo sem mudar sua estrutura." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Template Method • ornece uma estrutura fixa, de um algoritmo, esta parte fixa deve estar presente na superclasse, sendo obrigatório uma classeAbstrata que possa conter um método concreto, pois em uma interface só é possível conter métodos abstratos que definem um comportamento, esta é a vantagem de ser uma Classe Abstrata porque também irá fornecer métodos abstratos às suas subclasses, que por sua vez herdam este método, por Herança (programação), e devem implementar os métodos abstratos fornecendo um comportamento concreto aos métodos que foram definidos como abstratos. Com isso certas partes, do algoritmo, serão preenchidos por implementações que irão variar, ou seja, implementar um algoritmo em um método, postergando a definição de alguns passos do algoritmo, para que outras classes possam redefiní los PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando usar • Quando a estrutura fixa de um algoritmo puder ser definida pela superclasse deixando certas partes para serem preenchidos por implementações que podem variar PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Chain of Responsability "Evita acoplar o remetente de uma requisição ao seu destinatário ao dar a mais de um objeto a chance de servir a requisição. Compõe os objetos em cascata e passa a requisição pela corrente até que um objeto a sirva." [GoF] PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Propósito • Não conhecer de antemão qual objeto irá responder a uma determinada requisição. • Compor os objetos em cascata e passar a requisição pela corrente até que um objeto a sirva [Silva, 2005]. • Evitar a união entre o remetente de uma solicitação e seu receptor, dando aos diversos objetos uma chance de tratar da solicitação [Allen & Bambara, 2003]. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Motivação • Em projetos orientados a objetos manter os objetos com acoplamento fraco, mantendo específica e mínima a responsabilidade entre eles, faz com que mudanças sejam inseridas com menos risco de falhas. Os clientes apenas enxergam a interface visível do objeto permanecerem isolados de detalhes de implementação [Metsker, 2004]. • Uma máquina de refrigerantes necessita armazenar em locais diferentes cada tipo de moeda possível. Pode ser útil que um objeto receba a moeda, mas se ele não for capaz de armazenar no local correto, passe-o para outro objeto buscando a colocação correta da moeda [Silva, 2005]. Isso é um exemplo de tentativa de desacoplamento, já que se alguém não pode resolver determinada tarefa ocorre uma delegação da responsabilidade para outro objeto de forma totalmente transparente. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Quando usar • Mais de um objeto pode tratar de uma solicitação e este é desconhecido. • Uma solicitação deve ser emitida para um entre os vários objetos e o receptor, não sendo especificado explicitamente. • O conjunto de objetos capaz de tratar da solicitação deve ser especificado dinamicamente. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Estrutura PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Participantes • limentador : define a interface para tratar as solicitações e implementa a referência ao sucessor (opcional). • limentadorConcretoA, ..., AlimentadorConcretoN : trata as solicitações pelas quais é responsável. Pode acessar seu sucessor. Se o AlimentadorConcreto pode tratar a solicitação, ele assim o faz; caso contrário ele repassa a solicitação para o seu sucessor. • liente : Inicia a solicitação para um objeto AlimentadorConcreto da cadeia. • equisição : As instâncias de Requisição é que iram transportar as PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Vantagens • vita acoplamento do transmissor de um requisição com seus receptores, fazendo com que mais de um projeto tenha a chance de manipular a requisição. • ncadeia os objetos receptores e passa a requisição ao longo dessa cadeia até que um objeto possa manipulá-lo. • eduz a vinculação. • diciona flexibilidade. • PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • o exemplo ilustrado na Figura 2, a implementação é relacionada a uma máquina de refrigerantes, na qual vai-se adicionando moedas até o valor do refrigerante ser alcançado para a sua aquisição. • s classes contidas dentro do pacote “moedas” são os AlimentadoresConcretos, enquando Moeda é a requisição enviada. PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES ESTRUTURAIS GOF – AULA RAV1 PADRÕES DE PROJETO DE SOFTWARE Exemplo • omo existem infinitos tipos de moedas, pois é possível encontrar moedas tanto as que estão em circulação em nosso país, como as que estão em circulação nas mais de outras duzentas nações, além das moedas que já são antigas e não possui mais validade monetária, a máquina de refrigerantes tem que descobrir qual moeda entrou através de possíveis padrões, como por exemplo, a espessura, raio e peso. • este exemplo, a cada moeda que entra - a cada requisição - uma classe alimentadora analisa a moeda e busca ver se está dentro dos seus padrões, caso não esteja, vai passar para alguma outra classe alimentadora até que seja descoberta qual moeda entrou. Caso não se encaixe em nenhuma das especificações a moeda será descartada e não será computado valor PADRÕES ESTRUTURAIS GOF – AULA RAV1 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] PADRÕES DE PROJETO DE SOFTWARE Aula RAV2 – Revisão Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE O que veremos nesta terceira aula Revisão para AV2 e AV3 Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Classificação dos padrões GoF segundo Metsker [2] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Command "Encapsular uma requisição como um objeto, permitindo que clientes parametrizem diferentes requisições, filas ou requisições de log, e suportar operações reversíveis.“ [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Estrutura Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo padrão Command Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Iterator "Prover uma maneira de acessar os elementos de um objeto agregado sequencialmente sem expor sua representação interna." [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Problema Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Mediator "Definir um objeto que encapsula como um conjunto de objetos interagem. Mediator promove acoplamento fraco ao manter objetos que não se referem um ao outro explicitamente, permitindo variar sua interação independentemente." [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Problema • Como permitir que um grupo de objetos se comunique entre si sem que haja acoplamento entre eles? • Como remover o forte acoplamento presente em relacionamentos muitos para muitos? • Como permitir que novos participantes sejam ligados ao grupo facilmente? Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Solução • Introduzir um mediador • Objetos podem se comunicar sem se conhecer Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Memento "Sem violar o encapsulamento, capturar e externalizar o estado interno de um objeto para que o objeto possa ter esse estado restaurado posteriormente." [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Problema • É preciso guardar informações sobre um objeto suficientes para desfazer uma operação, mas essas informações não devem ser públicas Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Estrutura Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Visitor "Representar uma operação a ser realizada sobre os elementos de uma estrutura de objetos. Visitor permite definir uma nova operação sem mudar as classes dos elementos nos quais opera “ [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Problema Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo 1 Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo 3 Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Observer "Definir uma dependência um-para-muitos entre objetos para que quando um objeto mudar de estado, todos os seus dependentes sejam notificados e atualizados automaticamente." [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE State "Permitir a um objeto alterar o seu comportamento quanto o seu estado interno mudar. O objeto irá aparentar mudar de classe." [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Problema Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Strategy "Definir uma família de algoritmos, encapsular cada um, e fazê-los intercambiáveis. Strategy permite que algoritmos mudem independentemente entre clientes que os utilizam." [GoF] Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Problema Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo 1 Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Padrões GRASP • A qualidade de um projeto orientado a objetos está fortemente relacionada com a distribuição de responsabilidades • As responsabilidades de um projeto podem ser divididas em “conhecer” e “fazer” (Larman (2007): 1. As responsabilidades “conhecer” estão relacionadas à distribuição das características do sistema entre as classes 2. As responsabilidades “fazer” estão relacionadas com a distribuição do comportamento do sistema entre as classes Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Creator (Criador) • Problema: quem deve ser o responsável por criar instâncias de uma determinada classe? ” • Solução: um objeto deve ser criado por outro que o possua como parte (agregação) ou esteja fortemente associado a ele. • Para identificar o criador de um objeto A, verifique: • se o objeto A é parte em um relacionamento todo/parte; normalmente o todo é o responsável pela criação de A. • se algum outro objeto tem uma associação de um para muitos, onde A é o lado muitos. • se o objeto A está associado ao objeto de controle. • se alguma classe tem dados necessários à inicialização de A. Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo • Quem deve criar objetos ItemVenda? • Quem deve criar objetos Pagamento? • Quem deve criar objetos Venda? Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Low Coupling (Acoplamento Fraco) • O acoplamento é uma medida de quão fortemente uma classe está conectada a outras classes, tem conhecimento das mesmas ou depende delas. • Uma classe com baixo (fraco) acoplamento não depende de muitas outras. • Uma classe com acoplamento forte é: • �mais difícil de compreender isoladamente • �mais difícil de reutilizar (seu uso depende da reutilização • das outras classes da qual ela depende) • sensível a mudanças nas classes associadas. • Sempre que possível, evite que o envio de mensagens implique na criação de associações redundantes no modelo. Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Expert (Especialista da informação) • É o padrão mais usado para atribuir responsabilidades • Problema: dado um comportamento (responsabilidade) a qual classe essa responsabilidade deve ser alocada? • Solução: atribuir essa responsabilidade ao especialista da informação – a classe que tem a informação necessária para satisfazer a responsabilidade. Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo • Caso de uso registrar venda, foi identificada a responsabilidade do sistema gerar o total da venda. • Que classe deve assumir essa responsabilidade? Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Expert (Especialista da informação) • A informação necessária para uma tarefa computacional frequentemente está “espalhada” por vários objetos. • Portanto, há muitos experts parciais • Exemplo: determinar o total de uma venda requer a colaboração de 3 objetos, em 3 classes diferentes. • Neste caso mensagens são usadas para estabelecer as colaborações • Note que, com o uso do padrão Expert o encapsulamento das classes é mantido, já que: • �objetos usam sua própria informação para cumprir suas responsabilidades ou • �enviam mensagens a seus colaboradores para obter informações que não possuem Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Polymorphism (Polimorfismo) • Problema: o Como tratar alternativas em função do tipo da classe? O uso de ifs aninhados ou switch-case para selecionar comportamento em função do tipo de classe espalha-se por todo o código, dificultando a Manutenção • Solução: o Seleção do comportamento desejado através domecanismo de polimorfismo o Utilização de polimorfismo aplicado ao conceito de interfaces para permitir a substituição de componentes Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo If(tipo_pagamento == CARTAO_CREDITO) autorizar_credito() Else If(tipo_pagamento == CARTAO_DEBITO) autorizar_debito() Else If(tipo_pagamento == CHEQUE) autorizar_cheque() Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE High Cohesion (Coesão alta) • Problema: o Como manter a complexidade sob controle? o As classes são difíceis de compreender o As classes são difíceis de reutilizar o As classes são difíceis de manter o As classes são frágeis, sendo afetadas por praticamente todas as modificações • Solução: o Atribuir responsabilidade de forma que as classes não fiquem sobrecarregadas, e que as suas atribuições sejam relacionadas o O padrão High Cohesion também deve ser visto como um padrão de avaliação de padrões Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Controller(Controlador) • Problema: • Quem deveria ser responsável por tratar um evento do sistema? • Solução: atribuir a responsabilidade do tratamento de um evento do sistema a uma classe que representa uma das seguintes escolhas: o Representa o “sistema” todo (controlador fachada) o Representa um tratador oficial de todos os eventos de sistema de um caso de uso (controlador de caso de uso) Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Pure Fabrication (Invenção Pura) • Problema: o Que objeto deve ter a responsabilidade, quando não se quer violar a Alta Coesão e o Baixo Acoplamento, mas as soluções oferecidas por Expert não são adequadas? o Atribuir responsabilidades apenas para classes do domínio conceitual pode levar à situações de maior acoplamento e menos coesão. • Solução: o Atribuir um conjunto altamente coesivo de responsabilidades a uma classe artificial que não representa um conceito do domínio do problema. Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo • Apesar de Sale ser a candidata lógica para ser a Expert, para salvar a si mesma em um banco de dados, isto levaria o projeto a ter baixo acoplamento, alta coesão e baixo reuso; • Uma solução seria criar uma classe responsável somente por isto: Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Indireção • Problema: o A quem devemos atribuir a responsabilidade, evitando o acoplamento direto entre dois ou mais objetos? o Como desacoplar objetos apoiando o Acoplamento Baixo e maximizando o potencial de reuso? • Solução: o Atribua a responsabilidade a um objeto intermediário para mediar as mensagens entre outros componentes ou serviços, para que não sejam diretamente acoplados; o O objeto intermediário cria uma camada de indireção entre os dois componentes que não mais dependam um do outro: Ambos dependem da indireção. Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo • O objeto AdaptadorMestreDosImpostos atua como intermediário para o calculador externo de imposto. • Por meio de Polimorfismo, ele fornece uma interface consistente • com os objetos internos e ocultam as variações nas APIs externas Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo • O exemplo de Invenção Pura de desacoplar a Venda dos serviços de Banco de Dados através da classe ArmazenamentoPersistente • É também um exemplo de atribuir responsabilidade para apoiar a Indireção. Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Variações protegidas • Problema: o Como projetar objetos, subsistemas e sistemas para que as variações ou instabilidades nesses elementos não tenham um impacto indesejável nos outros elementos? • Solução: o Identificar pontos de variação ou instabilidade potenciais; o Atribuir responsabilidades para criar uma interface estável em volta desses pontos; o Encapsulamento, interfaces, polimorfismo, indireção e padrões; Máquinas virtuais e brokers são motivados por este princípio; o Evitar enviar mensagens a objetos muito distantes. Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Exemplo • A solução com Polimorfismo para os calculadores de impostos externos é um exemplo de Variações Protegidas Revisão – AULA RAV2 PADRÕES DE PROJETO DE SOFTWARE Variações protegidas • O ponto de instabilidade (variação) são as diferentes interfaces de calculadores externos • Acrescentando um nível de Indireção, uma Interface e usando o Polimorfismo com várias implementações de IAdaptadorDeCalculadorDeImposto o Protegemos o sistema a partir de variações nas APIs externas. o Objetos internos colaboram com uma interface estável o Várias implementações do Adaptador ocultam as variações para os sistemas externos. Revisão – AULA RAV2 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] revisaoav1 Número do slide 1 Número do slide 2 Número do slide 3 Número do slide 4 Número do slide 5 Número do slide 6 Número do slide 7 Número do slide 8 Número do slide 9 Número do slide 10 Número do slide 11 Número do slide 12 Número do slide 13 Número do slide 14 Número do slide 15 Número do slide 16 Número do slide 17 Número do slide 18 Número do slide 19 Número do slide 20 Número do slide 21 Número do slide 22 Número do slide 23 Número do slide 24 Número do slide 25 Número do slide 26 Número do slide 27 Número do slide 28 Número do slide 29 Número do slide 30 Número do slide 31 Número do slide 32 Número do slide 33 Número do slide 34 Número do slide 35 Número do slide 36 Número do slide 37 Número do slide 38 Número do slide 39 Número do slide 40 Número do slide 41 Número do slide 42 Número do slide 43 Número do slide 44 Número do slide 45 Número do slide 46 Número do slide 47 Número do slide 48 Número do slide 49 Número do slide 50 Número do slide 51 Número do slide 52 Número do slide 53 Número do slide 54 Número do slide 55 Número do slide 56 Número do slide 57 Número do slide 58 Número do slide 59 Número do slide 60 Número do slide 61 Número do slide 62 Número do slide 63 Número do slide 64 Número do slide 65 Número do slide 66 Número do slide 67 Número do slide 68 Número do slide 69 Número do slide 70 Número do slide 71 Número do slide 72 Número do slide 73 Número do slide 74 Número do slide 75 Número do slide 76 Número do slide 77 Número do slide 78 Número do slide 79 Número do slide 80 Número do slide 81 Número do slide 82 Número do slide 83 Número do slide 84 Número do slide 85 Número do slide 86 Número do slide 87 Número do slide 88 Número do slide 89 Número do slide 90 Número do slide 91 Número do slide 92 Número do slide 93 Número do slide 94 Número do slide 95 Número do slide 96 Número do slide 97 Número do slide 98 Número do slide 99 Número do slide 100 Número do slide 101 Número do slide 102 Número do slide 103 Número do slide 104 Número do slide 105 Número do slide 106 Número do slide 107 Número do slide 108 Número do slide 109 Número do slide 110 Número do slide 111 Número do slide 112 Número do slide 113 Número do slide 114 Número do slide 115 Número do slide 116 Número do slide 117 Número do slide 118 Número do slide 119 Número do slide 120 Número do slide 121 Número do slide 122 Número do slide 123 Número do slide 124 Número do slide 125 Número do slide 126 Número do slide 127 Número do slide 128 Número do slide 129 Número do slide 130 Número do slide 131 Número do slide 132 Número do slide 133 Número do slide 134 Número do slide 135 Número do
Compartilhar