Você está na página 1de 73

Introduo aos Padres de Projeto

(Padres GoF)
PUC Minas So Gabriel
Programao Modular

Contexto
GUI / Comunicao

TelaLogin
TelaLogin

TelaPagamentoQualitiCard
TelaPagamentoQualitiCard

Arquitetura do Sistema
NEGCIO

Fachada
Fachada
ControladorLogin
ControladorLogin

CadastroContasI
CadastroContasI
nternet
nternet

ContaInternet
ContaInternet

ControladorPagamentoQualitiCard
ControladorPagamentoQualitiCard

CadastroPagamentosCartao
CadastroPagamentosCartao

...

PagamentoCartao
PagamentoCartao

Interfaces
negcio-dados

IRepositorioContasInternet

IRepositorioPagamentosCartao

DADOS

RepositorioContasIn
RepositorioContasIn
ternetBDR
ternetBDR

RepositorioContasIn
RepositorioContasIn
ternetArquivo
ternetArquivo

RepositorioPagamentosC
RepositorioPagamentosC
artaoBDR
artaoBDR

RepositorioPagamentosCa
RepositorioPagamentosCa
rtaoBDOO
rtaoBDOO

Anlise e Projeto OO com UML e Padres | 2

Evoluo de Software
Grandes sistemas de software nunca so concludos; eles
simplesmente continuam evoluindo [Lehman]
Motivos e conseqncias (algumas Leis de Lehman)
Mudana Contnua e Crescimento Contnuo
Mudanas so inevitveis para que o software continue til
Adio de funcionalidades para manter a satisfao do usurio

Complexidade Crescente e Qualidade Decrescente


Mudanas aumentam a complexidade do software
Qualidade diminui a no ser que haja adaptaes

Anlise e Projeto OO com UML e Padres | 3

Como devemos proceder?


Pensar antes de agir!
Algumas aes:
Analisar impactos
Modelar, antes de codificar
Utilizar solues e tcnicas validadas

No reinventar a roda!

Anlise e Projeto OO com UML e Padres | 4

Padres em outras Engenharias


Cada padro descreve um problema que ocorre repetidas vezes em nosso
ambiente, e ento descreve o ncleo da soluo para aquele problema, de
tal maneira que pode-se usar essa soluo milhes de vezes sem nunca
faz-la da mesma forma duas vezes
Christopher Alexander, sobre padres em Arquitetura

Anlise e Projeto OO com UML e Padres | 5

Padres de Projeto / Design Patterns


Solues (validadas) para alcanar objetivos na engenharia de
software usando linguagens O-O
Registram conhecimento existente de forma que possam ser
reaplicados em vrios contextos

Os padres de projeto so descries de objetos que se


comunicam e classes que so customizadas para resolver um
problema genrico de design em um contexto especfico
Gamma, Helm, Vlissides & Johnson, sobre padres em software

Anlise e Projeto OO com UML e Padres | 6

Por que aprender padres?


Aprender com a experincia dos outros
identificar problemas comuns em engenharia de software
utilizar solues testadas e bem documentadas

Aprender boas prticas de programao


Padres utilizam eficientemente herana, composio,
modularidade, polimorfirmo e abstrao para construir cdigo
reutilizvel, eficiente, de alta coeso e baixo acoplamento

Ter um caminho e um alvo para refatoraes


Facilita a comunicao, compreenso e documentao
Vocabulrio comum
Ajuda a entender o papel de classes do sistemas

Anlise e Projeto OO com UML e Padres | 7

Elementos de um padro
Nome
Problema
Quando aplicar o padro, em que condies?

Soluo
Descrio abstrata de um problema e como usar os elementos
disponveis (classes e objetos) para solucion-lo

Conseqncias
Custos e benefcios de se aplicar o padro
Impacto na flexibilidade, extensibilidade, portabilidade e eficincia do
sistema

Anlise e Projeto OO com UML e Padres | 8

Metforas no mundo real


State

Observer

Pessoas reagem de formas Jornais so entregues aos


diferente de acordo com o seus assinantes .
humor.

Chain of Responsability
Chefe delega responsabilidade a
um subordinado, que delega a
outro, que ...

Padres so formados por vrios objetos.


Anlise e Projeto
OO com UML e Padres | 9
Cada objeto tem um papel (responsabilidade)
na soluo.

Padres de Projeto GoF


Padres de Projeto/Design

Introduzidos no livro em 1994

Descreve 23 padres
solues genricas para os problemas mais
comuns do desenvolvimento de software
orientado a objetos
obtidas atravs de experincias de sucesso
na indstria de software
Sobre o livro
Seus quatro autores so conhecidos como
"The Gang of Four (GoF)
O livro tornou-se um clssico na literatura
orientada a objetos e continua atual

Anlise e Projeto OO com UML e Padres | 10

Mais padres?
H vrios catlogos de padres para software
Muitos so especficos a uma determinada rea

padres J2EE
padres de implementao Java ou C#
padres para concorrncia
padres para distribuio
...

Os padres apresentados aqui so aplicveis em


Java e outras linguagens O-O
Anlise e Projeto OO com UML e Padres | 11

Padres de Projeto

Formas de classificao
H vrias formas de classificar os padres
Os padres GoF so tradicionalmente classificados pelo
propsito:
1. criao de classes e objetos
2. alterao da estrutura de um programa
3. controle do seu comportamento

Metsker os classifica em 5 grupos, por inteno


1.
2.
3.
4.
5.

oferecer uma interface


atribuir uma responsabilidade
realizar a construo de classes ou objetos
controlar formas de operao
implementar uma extenso para a aplicao

Anlise e Projeto OO com UML e Padres | 13

23 Padres GoF
Classificao por Propsito

** Classificao segundo GoF.

Anlise e Projeto OO com UML e Padres | 14

23 Padres GoF
Classificao por Inteno
Inteno

Padres

1. Interfaces

Adapter, Facade, Composite, Bridge

3. Construo

Factory Method, Abstract Factory,


Builder, Prototype, Memento

2. Responsabilidade

Singleton, Observer, Chain of Responsibility,


Mediator, Proxy, Flyweight

4. Operaes

Template Method, State, Command, Strategy,


Interpreter

5. Extenses

Iterator,Decorator, Visitor

Vistos em Sala

Vistos Anteriormente

Praticados nos prximos exerccios

** Classificao segundo Steven Metsker, Design Patterns Java Workbook, 2002.


Anlise e Projeto OO com UML e Padres | 15

PADRES RELACIONADOS A
INTERFACES
Anlise e Projeto OO com UML e Padres | 16

Interface
Interface:
coleo de mtodos e constantes que uma classe permite que
objetos de outras classes acessem
Exigem que a classe que implementa a interface oferea
implementao para seus mtodos
No garante que mtodos tero implementao que efetue alguma
computao: stubs

Anlise e Projeto OO com UML e Padres | 17

Padres relacionados a
Interfaces
Adapter:
para adaptar a interface de uma classe para outra que o cliente
espera

Composite:
definir uma interface comum para objetos individuais e
composies de objetos

Bridge:
desacoplar uma abstrao de sua implementao para que ambos
possam variar independentemente

Faade:
oferecer uma interface simples para uma coleo de classes

Anlise e Projeto OO com UML e Padres | 18

Fachada
Objetivo segundo o GoF:
oferecer uma interface nica para um conjunto
de interfaces de um subsistema.
Faade define uma interface de nvel mais
elevado que torna o subsistema mais fcil de
usar.

Anlise e Projeto OO com UML e Padres | 19

Relembrando o

Padro Faade
Cliente precisa saber muitos
detalhes do subsistema para
utiliz-lo!

slide com
animao

Crie uma fachada!

Anlise e Projeto OO com UML e Padres | 20

Adapter
Objetivo segundo o GoF:
converter a interface de uma classe em outra
interface esperada pelos clientes.
Adapter permite a comunicao entre classes
que no poderiam trabalhar juntas devido
incompatibilidade de suas interfaces.

Anlise e Projeto OO com UML e Padres | 21

Adapter
Problema e Soluo
Problema

Soluo

Cliente
operacao()
Deseja
utilizar
ClasseExistente
metodoUtil()

slide com
animao

Adaptador
void operacao() {
metodoEsperado();
}

metodoEsperado()
void metodoEsperado() {
metodoUtil();
}

Anlise e Projeto OO com UML e Padres | 22

Object Adapter
<<interface>>

Cliente

Alvo
operacao()
implementa

ClasseExistente ce;
...
ce.metodoUtil();

Adaptador
operacao()

Cliente: aplicao que colabora com objetos que implementam Alvo


Alvo: define a interface requerida pelo Cliente
ClasseExistente: classe dos objetos que requerem adaptao
Adaptador: adapta a interface do Recurso interface Alvo
Anlise e Projeto OO com UML e Padres | 23

Composite
Objetivo segundo o GoF:
Compor objetos em estruturas de rvore para
representar hierarquias todo-parte.
Composite permite que clientes tratem objetos
individuais e composies de objetos de maneira
uniforme.

Anlise e Projeto OO com UML e Padres | 24

Composite
Problema e Soluo
Problema

Soluo

Cliente precisa tratar de maneira


uniforme objetos individuais e
composies desses objetos

Tratar grupos e indivduos


diferentes atravs de uma nica
interface
Todos so
componentes
Cliente
Componente

Individuo

Grupo

Anlise e Projeto OO com UML e Padres | 25

Estrutura do Composite
:Composicao
:Composicao
:Folha

Componente

Cliente

:Folha

:Folha

:Folha

:Folha

1..*

operacao()

Folha
operacao()

Composio
operacao()
add(Componente)
remove(Componente)

filhos
for (int i=0; i<filhos.length; i++) {
filho = filhos[i];
filho.operacao();
}

Anlise e Projeto OO com UML e Padres | 26

Resumo: quando usar?


Faade
Simplificar o uso de uma coleo de objetos

Adapter
Adaptar uma interface existente para um cliente

Bridge
Implementar um design que permita total
desacoplamento entre interface e implementao

Composite
Tratar composies e unidades uniformemente
Anlise e Projeto OO com UML e Padres | 27

PADRES QUE OFERECEM


ALTERNATIVAS CONSTRUO DE
OBJETOS
Anlise e Projeto OO com UML e Padres | 28

Construtores
Alguns problemas em depender de construtores
Cliente pode no ter todos os dados necessrios para instanciar um
objeto
Cliente fica acoplado a uma implementao concreta (precisa saber a
classe concreta para usar new com o construtor)
Objeto complexo pode necessitar da criao de objetos menores
previamente, com certo controle difcil de implementar com
construtores
No h como limitar o nmero de instncias criadas

Anlise e Projeto OO com UML e Padres | 29

Padres que oferecem alternativas

construo de objetos
Factory Method: adia a deciso sobre qual classe concreta
instanciar
Abstract Factory: constuir uma famlia de objetos
relacionados
Prototype: especificar a criao de um objeto a partir de um
exemplo (modelo) fornecido
Memento: reconstruir um objeto a partir de uma verso que
contm apenas seu estado interno
Builder: Separa a criao de um objeto de sua representao

Anlise e Projeto OO com UML e Padres | 30

Factory Method
Objetivo segundo o GoF:
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 instanciao s subclasses.

Anlise e Projeto OO com UML e Padres | 31

Funcionamento de uma Fbrica


Problema:
O acesso a um objeto concreto ser feito atravs da interface conhecida
atravs de sua superclasse, mas o cliente tambm no quer (ou no
pode) saber qual implementao concreta estar utilizando

Fabrica
Poligono
desenha()
cliente

Forma

Retangulo

desenha()

desenha()
Circulo
desenha()

Anlise e Projeto OO com UML e Padres | 32

Estrutura do Factory Method

cliente

Criador

Produto

criarProduto()

CriadorConcreto

ProdutoConcreto

criarProduto()

Anlise e Projeto OO com UML e Padres | 33

Abstract Factory
Objetivo segundo o GoF:
Prover uma interface para criar famlias de
objetos relacionados ou dependentes sem
especificar suas classes concretas.

Anlise e Projeto OO com UML e Padres | 34

Problema
Criar uma famlia de objetos relacionados sem conhecer
suas classes concretas

Anlise e Projeto OO com UML e Padres | 35

Estrutura
cliente

FabricaAbstrata
criarProdutoUm()
criarProdutoDois()

FabricaConcretaA
criarProdutoUm()
criarProdutoDois()
FabricaConcretaB
criarProdutoUm()
criarProdutoDois()

ProdutoUm
ProdutoDois

ProdutoUmA
ProdutoDoisA
ProdutoUmB
ProdutoDoisB
Anlise e Projeto OO com UML e Padres | 36

Quando usar?
Factory Method
Para isolar a classe concreta do produto criado da interface usada pelo cliente

Abstract Factory
Para criar famlias inteiras de objetos que tm algo em comum sem
especificar suas interfaces.

Prototype
Para criar objetos usando outro como base

Memento
Para armazenar o estado de um objeto sem quebrar o encapsulamento. O uso
tpico deste padro na implementao de operaes de Undo.

Builder
Para construir objetos complexos em vrias etapas e/ou que possuem
representaes diferentes

Anlise e Projeto OO com UML e Padres | 37

PADRES ASSOCIADOS
DISTRIBUIO DE RESPONSABILIDADES
Anlise e Projeto OO com UML e Padres | 38

Padres associados

Distribuio de responsabilidades
Singleton: centraliza a responsabilidade em uma nica instncia de uma
classe

Observer: desacopla um objeto do conhecimento de que outros objetos


dependem dele

Mediator: centraliza a responsabilidade em uma classe que determina


como outros objetos interagem

Proxy: assume a responsabilidade de outro objeto (intercepta)


Chain of Responsibility: permite que uma requisio passe por uma
corrente de objetos at encontrar um que a processe

Flyweight: centraliza a responsabilidade em objetos compartilhados de


granularidade fina (blocos de montagem)

Anlise e Projeto OO com UML e Padres | 39

Singleton
Objetivo segundo o GoF:
Garantir que uma classe tenha uma nica instncia, e
prover um ponto de acesso global a ela.
independente do nmero de requisies que receber para
cri-lo

Aplicaes

Um nico banco de dados


Um nico arquivo de log
Um nico objeto que representa um vdeo
Uma nica fachada (Faade pattern)
Anlise e Projeto OO com UML e Padres | 40

Estrutura do Singlenton
Objeto com acesso
privado
Singlenton
- dados
-instancia : null
- Singlenton ()
+ getInstancia()
+getDados()

Construtor privado
Ponto de acesso esttico e global

public static synchronized Singlenton getInstancia() {


if (instancia == null) {
instancia = new Singlenton();
}
return instancia;
}

Lazy inicializatiom idiom


Anlise e Projeto OO com UML e Padres | 41

Observer
Objetivo segundo o GoF:
Definir uma dependncia um-para-muitos entre
objetos de forma que, quando um objeto mudar
de estado, todos os seus dependentes sejam
notificados e atualizados automaticamente.

Anlise e Projeto OO com UML e Padres | 42

Observer
Problema:

registra-se

notifica
altera

tempo

slide com
animao

Anlise e Projeto OO com UML e Padres | 43

Estrutura do Observer
for(int i =0; i < obs.lenght; i++){
obs[i].atualizar();
}

Sujeito
- obs: Observador[]
cadastrar(Observador)
remover(Observador)
notificar()

SujeitoConcreto
- dados
+ getDados()
+ setDados()

<<interface>
Observador
atualizar()

ObservadorConcreto
- conc: SujeitoConcreto
- dadosObservados
+ atualizar()

dadosObservados = conc.getDados();
Anlise e Projeto OO com UML e Padres | 44

Chain of Responsibility
Objetivo segundo o GoF:
"Evita acoplar o remetente de uma requisio ao seu destinatrio ao
dar a mais de um objeto a chance de servir a requisio.
Compe os objetos em cascata e passa a requisio pela corrente at
que um objeto a sirva.

Anlise e Projeto OO com UML e Padres | 45

Chain of Responsability
Problema
Permitir que vrios objetos
possam servir a uma requisio
ou repass-la
Permitir diviso de
responsabilidades de forma
transparente

Anlise e Projeto OO com UML e Padres | 46

Estrutura do
Chain of Responsability
cliente

<<interface>
Processador
processarRequisicao()

ProcessadorConcreto1
- sucessor: Processador
processarRequisicao()
ProcessadorConcreto2
- sucessor: Processador
processarRequisicao()
sucessor.processarRequisicao()

...
ProcessadorConcretoN
processarRequisicao()
Anlise e Projeto OO com UML e Padres | 47

Quando usar?
Singleton: quando apenas uma instncia for permitida
Observer: quando houver necessidade de notificao automtica
Chain of Responsibility: quando uma requisio puder ou precisar ser
tratada por um ou mais entre vrios objetos

Mediator: para controlar a interao entre dois objetos independentes


Proxy: quando for preciso um intermedirio para o objeto real
Flyweight: quando for necessrio reutilizar objetos visando
performance (cuidado com o efeito oposto!)

Anlise e Projeto OO com UML e Padres | 48

PADRES QUE LIDAM COM FORMAS DE


IMPLEMENTAR
OPERAES E ALGORITMOS
Anlise e Projeto OO com UML e Padres | 49

Padres que lidam com formas de implementar

operaes e algoritmos
Template Method:
implementa um algoritmo em um mtodo adiando a definio de alguns
passos do algoritmo para que subclasses possam defini-los

State:
distribui uma operao para que cada classe represente um estado diferente;
encapsula um estado

Strategy:
encapsula um algoritmo fazendo com que as implementaes sejam
intercambiveis

Command:
encapsula uma instruo em um objeto

Interpreter:
distribui uma operao de tal forma que cada implementao se aplique a um
tipo de composio diferente

Anlise e Projeto OO com UML e Padres | 50

Template Method
Objetivo segundo o GoF:
Definir o esqueleto de um algoritmo dentro de
uma operao, deixando alguns passos a serem
preenchidos pelas subclasses.
Template Method permite que suas subclasses
redefinam certos passos de um algoritmo sem
mudar sua estrutura.

Anlise e Projeto OO com UML e Padres | 51

Problema/Soluo
ClasseAbstrata
void concreto(){
... parteUm();
... parteDois();
}
abstract void parteUm();
abstract void parteDois();

ClasseConcretaA
parteUm();
parteDois();

ClasseConcretaB

algoritmo

lacunas:
parteUm
parteDois

Algoritmo
resultantes:

parteUm();
parteDois();

Anlise e Projeto OO com UML e Padres | 52

State
Objetivo segundo o GoF:
Permitir a um objeto alterar o seu
comportamento quando o seu estado interno
mudar.
O objeto ir aparentar mudar de classe.

Anlise e Projeto OO com UML e Padres | 53

Problema
Desconectado

Conectado

Transmitindo

Cenrio Atual:
:Objeto
Operao
If(estado == desconectado){
faaIsto();
} else if (estado == conectado){
falaAquilo();
} else {
faa();
}

Desejado:
estado.faa();

Desejamos usar objetos para representar estados e


polimorfismo para tornar a execuo de tarefas
dependentes de estado transparentes
Anlise e Projeto OO com UML e Padres | 54

Estrutura
<interface>
Estado

Contexto
estado: Estado

processar()

requisio()
estado.processar();

EstadoConcretoUm
processar()

EstadoConcretoDois
processar()

Contexto: define uma interface de interesse ao cliente, delegando suas


requisies ao estado corrente.
Estado: define uma interface para encapsular o comportamento de todos os
estados.
EstadoConcreto: implementa o comportamento associado ao estado do contexto.
Anlise e Projeto OO com UML e Padres | 55

Exemplo
TCPState

TCPConnection

open()
close()
acknowledge()

open()
close()
acknowledge()

TCPEstablished
open()
close()
acknowledge()

TCPListen

TCPClosed

open()
close()
acknowledge()

open()
close()
acknowledge()

Sempre que a aplicao mudar de estado, o objeto


TCPConnection muda o objeto TCPState que est usando
Anlise e Projeto OO com UML e Padres | 56

Command
Objetivo segundo GoF:
Encapsular uma requisio como um objeto,
permitindo que clientes parametrizem diferentes
requisies, filas ou requisies de log, e suportar
operaes reversveis.

Anlise e Projeto OO com UML e Padres | 57

Problema

Anlise e Projeto OO com UML e Padres | 58

Estrutura
Executor
cmd: Comando
executar()

Comando
executar()

cmd.executar ()

ComandoConcretoA
executar()

ComandoConcretoB
executar()

receptor.acao()

ReceptorA
aoA()

ReceptorB
aoB()

Anlise e Projeto OO com UML e Padres | 59

Conseqncias
Desacopla o invocador do receptor
So objetos; podem ser manipulados e
estendidos
Fcil adicionar novos comandos
Comandos compostos podem ser criados
usando o padro Composite

Anlise e Projeto OO com


UML e Padres | 60

quando usar?
Template Method
Para compor um algoritmo feito por mtodos abstratos que podem
ser completados em subclasses

State
Para representar o estado de um objeto

Command
Para representar um comando (ao imperativa do cliente)

Strategy
Para representar um algoritmo (comportamento)

Interpreter
Para realizar composio com comandos e desenvolver uma
linguagem de programao usando objetos

Anlise e Projeto OO com UML e Padres | 61

PADRES QUE PERMITEM


ACRESCENTAR COMPORTAMENTOS
Anlise e Projeto OO com UML e Padres | 62

Extenses
Extenso a adio de uma classe, interface ou mtodo a
uma base de cdigo existente
Formas de extenso
Herana (criao de novas classes)
Delegao (para herdar de duas classes, pode-se estender uma classe
e usar delegao para "herdar" o comportamento da outra classe)

Desenvolvimento em Java sempre uma forma de extenso


Extenso comea onde o reuso termina

Anlise e Projeto OO com UML e Padres | 63

Exemplo de
Extenso por Delegao

Anlise e Projeto OO com UML e Padres | 64

Padres que permitem


acrescentar comportamentos
Padres que permitem acrescentar comportamentos em um
objeto sem mudar sua classe
Decorator: adiciona responsabilidades a um objeto dinamicamente
Iterator: oferece uma maneira de acessar uma coleo de instncias
de uma classe
Visitor: permite a adio de novas operaes a uma classe sem mudar
a classe

Anlise e Projeto OO com UML e Padres | 65

Decorator
Objetivo segundo GoF:
Anexar responsabilidades adicionais a um objeto
dinamicamente.
Decorators oferecem uma alternativa flexvel ao
uso de herana para estender uma
funcionalidade.

Anlise e Projeto OO com UML e Padres | 66

Estrutura
Componente
operacao()

ComponenteConcreto
operacao()

Decorador
operacao()

DecoradorConcretoA
estadoAdicional
operacao()

component.operacao();

DecoradorConcretoB
comportamentoAdicional()
operacao()
super.operacao();
comportamentoAdicional();
Anlise e Projeto OO com UML e Padres | 67

Exemplo
Toolkit de interface grfica
Texto - componente concreto
Texto com bordas - decorator
Texto com bordas e barra de rolagem - decorator

Anlise e Projeto OO com


UML e Padres | 68

Conseqncias
Mais flexibildade que herana esttica
Modelo tende a ficar mais simples e uniforme
Entretanto
Apesar de um decorator e o componente serem
do mesmo tipo, no so o mesmo objeto
Proliferao de pequenos objetos que
implementam as extenses
Qual a diferena entre o Decorator Adaptador?
Anlise e Projeto OO com
UML e Padres | 69

Iterator
Objetivo de acordo com o GoF:
Prover uma maneira de acessar os elementos de
um objeto agregado seqencialmente sem expor
sua representao interna.

Anlise e Projeto OO com UML e Padres | 70

Problema
Tipo genrico

Iterator

Coleo arbitrria de objetos


(array, hashmap, lista, conjunto,
pilha, tabela, ...)

Anlise e Projeto OO com UML e Padres | 71

Iterator

Iterators servem para acessar o contedo de um agregado (colees, arrays,


etc) sem expor sua representao interna
Oferece uma interface uniforme para percorrer diferentes estruturas
agregadas
Em Java, Iterators so implementados nas colees. obtido atravs do
mtodo iterator() de Collection, que devolve uma instncia de
java.util.Iterator.
Interface java.util.Iterator:

package java.util;
public interface Iterator<E> {
boolean hasNext();
Object next();
void remove();
}

iterator() um exemplo de Factory Method


Anlise e Projeto OO com UML e Padres | 72

quando usar?
Decorator
Para acrescentar recursos e comportamento a um
objeto existente, receber sua entrada e poder
manipular sua sada.

Iterator
Para navegar em uma coleo elemento por elemento

Visitor
Para estender uma aplicao com novas operaes
sem que seja necessrio mexer na interface existente.
Anlise e Projeto OO com UML e Padres | 73

Você também pode gostar