design patterns - introdução

30
Design Patterns PSS Aula I (Introdução)

Transcript of design patterns - introdução

Page 1: design patterns - introdução

Design Patterns

PSS Aula I (Introdução)

Page 2: design patterns - introdução

Design Patterns

A definição clássica para Pattern é a seguinte: "um Pattern descreve um problema que se repete várias vezes em um determinado meio, e em seguida descreve o núcleo da sua solução, de modo que esta solução possa ser usada milhares e milhares de vezes” [Christopher Alexander].

Patterns são soluções genéricas e reutilizáveis, aplicáveis em classes de problemas bem conhecidos. Soluções que um dia funcionaram, tornam-se receitas para situações similares (desde que estas soluções tenham sido projetadas com flexibilidade).

Page 3: design patterns - introdução

Patterns - Histórico

A idéia de armazenar informação sobre padrões observados em um contexto pode ser atribuída ao arquiteto Christopher Alexander e foi elaborada no contexto de arquitetura. Alexander define um ordem para a aplicação de

patterns; O enfoque do pattern é problema em questão; É sustentada a teoria que patterns podem gerar

arquiteturas completas. No seu livro The Timeless Way of Building, mostra

como patterns podem ser aplicados na construção de casas, assim como no planejamento de bairros e cidades.

Page 4: design patterns - introdução

Patterns - Histórico

Em 1994, 4 autores – Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides -publicaram o primeiro catálogo de Design Patterns para programas orientado a objetos: Design Patterns – Elements of Reusable Object-Oriented software (GoF book).

Page 5: design patterns - introdução

Estrutura do Gamma

Introdução;Estudo de Casos;Catálogo de Design Patterns.

Page 6: design patterns - introdução

Estrutura de um Pattern

Nome - A identificação do Pattern é importante pois ele torna-se membro do vocabulário do projetista e de seus colegas.

Problema - descreve quando aplicar o Pattern. Apresenta a classe de problemas em questão e seu contexto.

Solução - descreve os elementos que fazem parte do design, seus relacionamentos, responsabilidades e colaborações.

Conseqüências - os resultados e efeitos causados pela aplicação do Pattern.

Page 7: design patterns - introdução

Classificações de Patterns

Podem ser classificados quanto ao: Escopo:

Classes;Objetos.

Quanto ao seu propósito:Criacional;Estrutural;Comportamental.

Page 8: design patterns - introdução

Organização de Design Patterns

Quanto ao escopo: classes: patterns tratam do relacionamento

entre classes e subclasses; objetos: patterns tratam relacionamentos

entre objetos e por isso podem ser alterados em tempo de execução.

Ex: Um padrão estrutural de classe utiliza herança para compor as classes, enquanto um padrão estrutural de objeto descreve como estes devem ser agrupados.

Page 9: design patterns - introdução

Organização de Design Patterns

Quanto ao seu propósito: Criacional; Estrutural; Comportamental.

Page 10: design patterns - introdução

Organização de Design Patterns

Quanto ao seu propósito: Criacional:

Diz respeito ao processo de criação de um objeto;Ex1: Builder - separa a construção de um objeto

complexo de sua representação, desta maneira um mesmo processo pode ser utilizado para criar diferentes representações.

Estrutural; Comportamental.

Page 11: design patterns - introdução

Organização de Design Patterns

Quanto ao seu propósito: Criacional; Estrutural:

Diz respeito a composição de objetos e classes;Ex: Composite - Compõe objetos em árvores de

agregação (relacionamento parte-todo). O Composite permite que objetos agregados sejam tratados como um único objeto.

Comportamental.

Page 12: design patterns - introdução

Organização de Design Patterns

Quanto ao seu propósito: Criacional; Estrutural; Comportamental:

Caracteriza o modo como classes e objetos interagem e compartilham responsabilidades.

Ex: Iterator - Provê um modo de acesso a elementos de um agregado de objetos, seqüencialmente, sem exposição de estruturas internas.

Page 13: design patterns - introdução

Organização dos Design Patterns

PropósitoCriação Estrutural Funcionamento

Escopo Class Factory Method Adapter (classe) InterpreterTemplate Method

Object Abstract Factory Adapter (object) Chain of ResponsibilityBuilder Bridge CommandPrototype Composite Iterator Singleton Decorator Mediator

Façade MementoFlyweight ObserverProxy State

StrategyVisitor

Page 14: design patterns - introdução

Descrição de Patterns Nome do Pattern e Classificação: Passa a fazer parte do

vocabulário dos projetistas. Propósito: Respostas para as perguntas - O quê o Pattern faz?

Que tipo de problema ou característica particular de Design ele trata?

Também Conhecido Como: Conjunto de outros nomes (apelidos) conhecidos para o Pattern, se existir algum.

Motivação: Um cenário que ilustra o problema de Design e como as estruturas de classes e objetos no Pattern o resolvem.

Aplicação: Respostas para as perguntas - Quais são as situações onde este Pattern pode ser aplicado? Quais são os exemplos de Designs que ele pode tratar? Como você pode reconhecer estas situações?

Estrutura: Uma representação gráfica das classes no Pattern. Participantes: As classes e/ou objetos que participam no

Design Pattern, e suas responsabilidades.

Page 15: design patterns - introdução

Descrição de Patterns

Colaborações: Como os participantes interagem para cumprir suas responsabilidades.

Conseqüências: Respostas para as perguntas - Como o Pattern alcança seus objetivos? Quais são os resultados do uso do Pattern?

Implementação: Dicas e técnicas que Designer deve saber, e possíveis armadilhas para as quais ele deve estar preparado.

Código Exemplo: Fragmentos de código que ilustrem como o Pattern deve ser implementado

Usos Conhecidos: Exemplos de utilização do Pattern em sistemas já implementados.

Patterns Relacionados: Lista de todos os Patterns fortemente relacionados ao Pattern em questão e as suas principais diferenças.

Page 16: design patterns - introdução

Iterator Nome do Pattern e Classificação:

Iterator - Funcional de objeto Propósito:

Provê um modo de acesso a elementos de um agregado de objetos, seqüencialmente, sem exposição de estruturas internas.

Também Conhecido Como: Cursor

Motivação: Um objeto que possua agregações deve permitir que seus

elementos sejam acessados sem que sua estrutura interna seja exposta. De uma maneira geral pode se desejar que estes elemento sejam percorridos em várias ordens. De frente para trás, vice-versa, ou mesmo em ordem aleatória, sem no entanto ter que modificar a interface de lista dependendo do percorrimento. Este pattern permite que isto seja feito.

Page 17: design patterns - introdução

Iterator

Motivação: Cabe ao pattern o acesso e o percorrimento da lista de diferentes formas. Estas funções são armazendas em um objeto Iterator. A classe Iterator define um interface para o acesso aos elemento da lista.

Os objetos listas são responsáveis por criar seus próprios iteradores e o fazem através do “Factory Method”

Iterator

First()Next()IsDone()CurrentItem()

AbstractList

CreateIterator()Count()Append()Remove()

<<Interface>>

List

CreateIterator()

ListIterator

SkipListIteratorSkipList

CreateIterator()

Cliente

Page 18: design patterns - introdução

Iterator

Aplicação: O uso do pattern se aplica quando se quer: acessar o conteúdo de objeto agregados sem expor sua

representação interna; suportar mais de uma maneira de percorrer a lista; prover interface única para percorrer estruturas

agregadas diferentes.

Page 19: design patterns - introdução

Iterator

Estrutura:

Iterator

First()Next()IsDone()CurrentItem()

Aggregate

CreateIterator()

<<Interface>>

ConcreteAggregate

CreateIterator()

ConcreteIterator

return new ConcreteIterator (this)

Cliente

Page 20: design patterns - introdução

Iterator

Participantes: Iterator

Define um interface para o acesso e percorrimento; ConcreteIterator

Implementa a interface do Iterator; Mantéma informação sobre o elemento percorrido;

Aggregate Define um interface para a criação do objeto Iterator;

ConcreteAggregate Implementa o método da interface que retorna uma

instância do ConcreteIterator.

Colaborações: ConcreteIterator mantém a referência ao objeto que está sendo percorrido, podendo calcular qual o elemento seguinte.

Page 21: design patterns - introdução

Iterator

Conseqüências: Suporta variações na ordem de percorrimento de maneira

fácil; Simplifica a interface Aggregate; Mais de um percorrimento pode acontecer, já que o seu

estado é armazenado em cada Iterator. Implementação: … Código Exemplo: ... Usos Conhecidos: ... Patterns Relacionados:

Composite: Estruturas recursivas; Factory Method; Memento.

Page 22: design patterns - introdução

Dicas

Design Patterns podem ajudar a: buscar objetos apropriados e sua granularidade: Objetos

que representam processos ou algoritmos não existem na natureza mais são elementos fundamentais para se obter um Design flexível, especificar interfaces apropriadas

Definir o problema, uma possível solução, todavia sem entrar em detalhes de implementação;

Verificar o propósito de cada pattern, segundo os intuitos de criação, estruturação e comportamento;

Estudar como cada pattern pode se relacionar; Examinar problemas de um possível redisign (pag

24); Considerar o que pode ser variável no seu design.

Page 23: design patterns - introdução

Patterns – Exemplo 1MVC - (Model/View/Controller) é um trio de

classes usadas para a construção de interfaces no Smalltalk-80. Model representa a aplicação em si; View é uma apresentação

de tela para uma aplicação; Controller define como a

interface do usuário reage a estímulos externos.

Page 24: design patterns - introdução

Patterns – Exemplo 1

A aplicação se comunica com suas visões quando seus atributos mudam, e as visões, por sua vez, se comunicam com a aplicação para acessar estes valores. (subscribe/notify)

Uma visão usa uma instância de uma subclasse de Controller para implementar uma determinada estratégia de resposta.

Page 25: design patterns - introdução

Pattern – Exemplo 1

MVC desacopla visões e aplicação - Observer; desacopla objetos de modo que mudanças em

um deles possam afetar outros; O MVC pode ser modelado com o uso de

vários patterns como: Observer, Composite, Strategy, o Factory Method para especificar um controlador padrão para uma visão, e o Decorator para adicionar uma scrollbar a uma janela.

Page 26: design patterns - introdução

Catálogo de Design Patterns

Abstract Factory: Provê uma interface para criação de famílias de objetos relacionados ou interdependentes. Remove a dependência entre o cliente, que usa os objetos, e a classe dos objetos produzidos.

Adapter: Converte a interface de uma classe em outra, esperada pelo cliente. O Adapter permite que classes que antes não poderiam trabalhar juntas, por incompatibilidade de interfaces, possam agora fazê-lo.

Bridge: Separa uma abstração de sua implementação, de modo que ambas possam variar independentemente.

Builder: Provê uma interface genérica para a construção incremental de agregações. Um Builder esconde os detalhes de como os componentes são criados, representados e compostos.

Page 27: design patterns - introdução

Catálogo de Design Patterns

Chain of Responsibility: Encadeia os objetos receptores e transporta a mensagem através da corrente até que um dos objetos a responda. Assim, separa (provê loose coupling) objetos transmissores dos receptores, dando a chance de mais de um objeto poder tratar a mensagem.

Command: Encapsula uma mensagem como um objeto, de modo que se possa parametrizar clientes com diferentes mensagens. Separa, então, o criador da mensagem do executor da mesma.

Composite: Compõe objetos em árvores de agregação (relacionamento parte-todo). O Composite permite que objetos agregados sejam tratados como um único objeto.

Decorator: Anexa responsabilidades adicionais a um objeto dinâmicamente. Provê uma alternativa flexível para extensão de funcionalidade, sem ter que usar Herança.

Page 28: design patterns - introdução

Catálogo de Design Patterns

Facade: Provê uma interface unificada para um conjunto de interfaces em um subsistema. O Facade define uma interface alto nível para facilitar o uso deste subsistema.

Factory Method: Define uma interface para criação de um objeto, permitindo que as suas subclasses decidam qual classe instanciar. O Factory Method deixa a responsabilidade de instanciação para as subclasses.

Flyweight: Usa o compartilamento para dar suporte eficiente a um grande número de objetos com alto nível de granularidade.

Interpreter: Usado para definição de linguagem. Define representações para gramáticas e abstrações para análise sintática.

Iterator: Provê um modo de acesso a elementos de um agregado de objetos, sequencialmente, sem exposição de estruturas internas.

Page 29: design patterns - introdução

Catálogo de Design Patterns

Mediator: Desacopla e gerencia as colaborações entre um grupo de objetos. Define um objeto que encapsula as interações dentre desse grupo.

Memento: Captura e externaliza o estado interno de um objeto (captura um "snapshot"). O Memento não viola o encapsulamento.

Observer: Provê sincronização, coordenação e consistência entre objetos relacionados.

Prototype: Especifica os tipos de objetos a serem criados num sistema, usando uma instância protótipo. Cria novos objetos copiando este protótipo.

Proxy: Provê Design para um controlador de acesso a um objeto.

Singleton: Assegura que uma classe tenha apenas uma instância e provê um ponto global de acesso a ela.

Page 30: design patterns - introdução

Catálogo de Design Patterns

State: Deixa um objeto mudar seu comportamento quando seu estado interno muda, mudando, efetivamente, a classe do objeto.

Strategy: Define uma família de algoritmos, encapsula cada um deles, e torna a escolha de qual usar flexível. O Strategy desacopla os algoritmos dos clientes que os usa.

Template Method: Define o esqueleto de um algoritmo em uma operação. O Template Method permite que subclasses componham o algoritmo e tenham a possibilidade de redefinir certos passos a serem tomados no processo, sem contudo mudá-lo.

Visitor: Representa uma operação a ser realizada sobre elementos da estrutura de um objeto. O Visitor permite que se crie um nova operação sem que se mude a classe dos elementos sobre as quais ela opera.