Você está na página 1de 30

Design Patterns

PSS
Aula I (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).
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.
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).
Estrutura do Gamma

Introdução;
Estudo de Casos;
Catálogo de Design Patterns.
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.
Classificações de Patterns

Podem ser classificados quanto ao:


Escopo:
Classes;
Objetos.
Quanto ao seu propósito:
Criacional;
Estrutural;
Comportamental.
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.
Organização de Design Patterns

Quanto ao seu propósito:


Criacional;
Estrutural;
Comportamental.
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.
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.
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.
Organização dos Design Patterns

Propósito
Criação Estrutural Funcionamento
Escopo Class Factory Method Adapter (classe) Interpreter
Template Method
Object Abstract Factory Adapter (object) Chain of Responsibility
Builder Bridge Command
Prototype Composite Iterator
Singleton Decorator Mediator
Façade Memento
Flyweight Observer
Proxy State
Strategy
Visitor
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.
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.
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.
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.
Cliente
 Os objetos listas são
responsáveis por criar seus
próprios iteradores e o fazem
através do “Factory Method”
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.
Iterator
 Estrutura:

Cliente
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.
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.
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.
Patterns – Exemplo 1
MVC - (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.
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.
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.
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.
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.
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.
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.
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.

Você também pode gostar