Вы находитесь на странице: 1из 61

Padres de Projeto de

Software
Algoritmos e Programao II
Fbio M. Pereira

Roteiro

Introduo:
O que so padres de projeto?
Motivao

Conceitos bsicos:

Atributos
Problemas
Seleo
Uso

Tipos
Exemplos

Introduo

Engenharia de Software trata:


Metodologia para desenvolvimento de sistemas
Linguagem de Modelagem para o projeto de
software

Dificuldades:
Falta de experincia
Dificuldade de combinao de todos os
elementos

Estudos de Casos so uma fonte bastante


rica para a soluo de problemas de projeto,
mesmo para projetistas experientes

Padres de projeto de SW

Padres de Projeto de Software ou Design Patterns


descrevem solues para problemas recorrentes no
desenvolvimento de sistemas de software orientados
a objetos
Pelo fato de ser recorrente, vale a pena que seja estudada
e documentada

Os padres de projeto visam facilitar a reutilizao de


solues na fase de projeto do software
Tambm resultam em um vocabulrio comum de
projeto, facilitando comunicao, documentao e
aprendizado dos sistemas de software
O que faz um padro de projeto?

Nomeia, abstrai e identifica os aspectos-chave de uma


estrutura de projeto comum para torn-la til para a
criao de um projeto orientado a objetos reutilizvel

Outras vantagens
Aumento da comunicao entre times e
aprendizagem individual
Aumento da capacidade de modificao e de
manuteno de cdigo
Aumento do entendimento de princpios de
projeto bsicos em orientao a objetos
(encapsulamento, herana e polimorfismo)
Adoo de estratgias melhores mesmo
quando padres no esto presentes
Aprendizado de melhores alternativas para
problemas complexos, principalmente
aqueles com grandes hierarquias

Problemas solucionados por


padres

Procurando objetos apropriados


Determinando a granularidade dos objetos
Especificando interfaces dos objetos
Especificando implementaes dos objetos
Herana de classe versus herana de interface
Programando para uma interface, no para uma
implementao

Colocando os mecanismos de reutilizao


para funcionar
Herana versus composio
Delegao
Herana versus tipos parametrizados

Problemas solucionados por


padres
Relacionando estruturas de tempo de
execuo e de tempo de compilao
Projetando para mudanas

Dependncias de operaes especficas, plataformas


de software e hardware, de representaes ou
implementaes de objetos e algortmicas
Acoplamento forte
Incapacidade na alterao de classes

Programas de aplicaes
Bibliotecas de classes (toolkits)
Conjuntos de classes (frameworks)

Atributos

Nome
Referncia que descreve de forma bastante sucinta o
padro

Problema
Motivao, inteno e objetivos, aplicabilidade
Apresenta o contexto do padro e quando ele pode
ser usado

Soluo
Estrutura, participantes, exemplo de cdigo
Descreve a soluo e os elementos que a compem

Consequncias e padres relacionados


Analisa os resultados, vantagens e desvantagens
obtidos com a aplicao do padro

Como selecionar um padro de


projeto?
Considere como os padres de projeto
solucionam problemas de projeto
Examine as sees de descrio do
problema de cada padro
Estude como os padres se inter-relacionam
Estude padres de finalidades semelhantes
Examine uma causa de reformulao de
projeto
Considere o que deveria ser varivel no seu
projeto

Como usar um padro de projeto?

Leia o padro por inteiro, uma vez, para obter


uma viso geral
Estude as sees de descrio do problema e do
padro
Olhe exemplos de cdigo do padro
Escolha nomes para os participantes do padro
que tenham sentido no contexto da aplicao
Defina as classes
Defina nomes especficos da aplicao para
operaes no padro
Implemente as operaes para suportar as
responsabilidades e colaboraes presentes

Tipos de padres de projeto

Em geral os padres de projeto podem ser


classificados em trs diferentes tipos:
Padres de criao
Abstraem o processo de criao de objetos a partir da
instanciao de classes
Abstract Factory, Factory Method, Sigleton, Builder, Prototype

Padres estruturais
Tratam da forma como classes e objetos esto organizados
para a formao de estruturas maiores
Adaptor, Decorator, Proxy, Bridge, Facade, Composite, Flyweight

Padres comportamentais
Preocupam-se com algoritmos e a atribuio de
responsabilidades entre objetos
Chain of Responsibility, Mediator, Strategy, Command, Memento,
Template Method, Interpreter, Observer,Visitor, Iterator, State

Tipos de padres de projeto

Podem ser subclassificados em:


Padres de classes
Em geral estticos, definidos em tempo de
compilao

Padres de objetos
Em geral dinmicos, definidos em tempo de
execuo

Padres GoF (Gang of Four)


Design Patterns: Elements of Reusable Object-Oriented Software (ISBN 0201-63361-2) is a software engineering book describing recurring solutions to
common problems in software design. The book's authors are Erich
Gamma, Richard Helm, Ralph Johnson and John Vlissides with a foreword
by Grady Booch. They are often referred to as the Gang of Four, or GoF. The
book is divided into two parts, with the first two chapters exploring the
capabilities and pitfalls of object-oriented programming, and the remaining
chapters describing 23 classic software design patterns. The book includes
examples in C++ and Smalltalk. It won a Jolt productivity award, and Software
Development productivity award in 1994.
The original publication date of the book was October 21, 1994 with a 1995
copyright, and as of April 2007, the book was in its 36th printing. The book was
first made available to the public at OOPSLA meeting held in Portland, Oregon
in October 1994. It has been highly influential to the field of software
engineering and is regarded as an important source for object-oriented design
theory and practice. More than 500,000 copies have been sold in English and in
13 other languages.
Wikipedia

Padres de Projeto de
Criao
- Abstract

Factory

Builder
- Factory Method
- Prototype
- Singleton
-

Abstract Factory

Fornece uma interface para a criao de


famlias de objetos relacionados ou
dependentes sem especificar suas classes
concretas
Algumas vezes vrios objetos precisam ser
instanciados em uma maneira coordenada
Por exemplo,

Quando lidamos com interfaces do usurio, o


sistema pode precisar usar um conjunto de
objetos para trabalhar em um sistema
operacional e um outro conjunto de objetos para
trabalhar em um sistema operacional diferente
Transportabilidade entre diferentes sistemas de
interfaces grficas (Windows, Motif, MacOS)

Abstract Factory

Builder
Separa a construo (geralmente passo a passo)
de um objeto complexo da sua representao, de
modo que o mesmo processo de construo
possa criar diferentes representaes
Permite que um objeto cliente construa um
objeto complexo especificando apenas o seu tipo
e o seu contedo

O cliente blindado dos detalhes da construo do


objeto

Exemplos:

O problema de construir um programa que realize


gateway para e-mails
O programa recebe mensagens que esto no formato MIME 3
e encaminha as mensagens para diferentes tipos de sistemas
de e-mail

Converso de formatos de texto em editores

MessageBuilder is an abstract
builder class. It defines
methods that correspond to
the various header fields and
body types that MIME
supports. It declares abstract
methods that correspond to
required header fields and the
most common body types. It
declares these methods
abstract because all concrete
subclasses of MessageBuilder
should define these methods.
However, some of the
optional header fields such as
organization and fancier body
types such as Image/Jpeg
may not be supported in all
message formats, so the
MessageBuilder class
provides do-nothing
implementations of these
methods.

The MessageBuilder class also defines a class method called getInstance. A MIMEParser object passes
the get Instance method the destination address of the message it is parsing. From the message's
destination address, the getInstance method determines the message format needed for the new message.
It returns an instance of the subclass of Message-Builder appropriate for the format of the new
message to the MIMEParser object.
The MAPIBuilder and PROFSBuilder classes are concrete builder classes for building Messaging
Application Programming Interface (MAPI) and PROFS (a registered trademark of the IBM
corporation) messages, respectively.
The builder classes create product objects that implement the OutboundMsgIF interface. This interface
defines a method called send that is intended to send the e-mail message wherever it is supposed to go.
1.1.6MessageManager
1.A
1.1.2
The MIMEParser
object
object
receives
passes
calls
an e-mail
the
destination
MessageBuilder
message.
emailobject's
address to the
MessageBuilder
getOutboundMsg
object's
method
toto
method.
complete
1.1 The MessageManager
object
calls
the MIMEParser
and
fetch
new class's
message.
parse method.
1.1.3
Thethe
MIMEParser
object
passes
It will
the
originating
anemail
OutboundMessageIF
address
to the
1.2
Thereturn
MessageManager
object
calls
object
MessageBuilder
the
OutboundMsg
that encapsulates
object's
object's
the
from
send
new
method.
message
method.
inMIMEParser
thesends
needed
theformat.
message
off
1.1.4
TheThis
object passes
the
and
email
completes
the message
simple
content
processing.
1.1.1
Themessage's
MIMEParser
object
callsto
the MessageBuilder object's
class's getInstance
plainText
method, passing it the destination
method.
email The
address.
By analyzing
thepasses
1.1.5
MIMEParser
object
address,
the
emailthe
message's
method attached
selects a jpeg
concrete
subclass
image
to of
thethe
MessageBuilder
MessageBuilder
object's
class
and createsmethod.
jpegImage
an instance of it.

Factory Method
Define uma interface para criar um
objeto, mas deixa as subclasses decidirem
qual classe ser instanciada
Permite a uma classe postergar a
instanciao de subclasses
Bastante utilizado em toolkits e
frameworks para a instanciao de
objetos

Factory Method
FactoryIF. This
ProductIF.
The objects
is an applicationcreated using this
pattern mustinterface.
independent
implement
Objects
an interface
that create
in this
role.
ProductIF
objects on behalf of
CreationRequester
must implement
ConcreteProduct1,objects
ConcreteProduct2,
this
Interfaces
thisare
sort declare
and interface.
so on. Classes
in thisofrole
ainstantiated
method that
bycan
a Factory
be called
object.
by a Classes in
this role must implement
CreationRequester
object the
to create
ProductIF
concrete
interface.objects. The arguments this
product
method
takes are discussed
CreationRequester.
A classunder
in thisthe
role is
an application-independent
Implementation
section for class
this pattern.
that needs
to create application-specific
Interfaces
filling this role willclasses.
typically
It does
have
indirectly
throughthe
an instance
of a class
asoname
that includes
word Factory,
such
that
as
DocumentFactoryIF
implements the FactoryIF
or ImageFactoryIF.
interface.
Factory. This is an application-specific class
that implements the appropriate FactoryIF
interface and has a method to create
ConcreteProduct objects. Classes filling this
role will typically have a name, such as
DocumentFactory or ImageFactory, that
contains the word Factory.

Factory Method

Sem
Factory Method

Prototype
Especifica os tipos de objetos a serem criados
usando uma instncia como prottipo e cria
novos objetos copiando este prottipo
Permite que um objeto crie objetos customizados
sem conhecer a sua classe exata ou os detalhes
de como eles sero criados

Objetos a serem utilizados como prottipos devem


possuir um mtodo (clone) que retorna um novo
objeto que uma cpia do objeto original

Exemplo:
Criao de objetos de desenho CAD a partir de
prottipos previamente criados

Client. The client class represents the


rest of the program for the purposes
of the Prototype pattern. The client
class needs to create objects that it
knows little about. Client classes will
have a method that can be called to add
a prototypical object to a client object's
collection. In Figure 5.14, this method
is indicated with the name
registerPrototype. However, a name
that reflects the sort of object being
prototyped, such as registerSymbol, is
more appropriate in an actual
implementation.
Prototype. Classes in this role implement the PrototypeIF interface and are instantiated for the purpose
of being cloned by the client. Classes in this role are commonly abstract classes with a number of
concrete subclasses.
PrototypeIF. All prototype objects must implement the interface that is in this role. The client class
interacts with prototype objects through this interface. Interfaces in this role should extend the
Cloneable interface so that all objects that implement the interface can be cloned.
PrototypeBuilder. This corresponds to any class instantiated to supply prototypical objects to the client
object. Such classes should have a name that denotes the type of prototypical object that they build, such
as SymbolBuilder.
A PrototypeBuilder object creates Prototype objects. It passes each newly created Prototype object to a
Client object's registerPrototype method.

O padro Singleton

Objetivo
Queremos apenas uma instncia de um objeto, mas no existe um objeto global que
controla a instanciao deste objeto
Queremos tambm garantir que todas as entidades esto usando a mesma instncia
deste objeto

Problema
Vrios objeto clientes diferentes precisam referenciar a mesma coisa, e queremos
garantir que no exista mais que uma dela

Soluo
Garantir uma nica instncia

Consequncias
Clientes no precisam se preocupar se uma instncia do Singleton existe pois o
controle feito internamente

Implementao
Adicione um membro esttico privado da classe que referencia o objeto desejado
(inicialmente = null)
Adicione um mtodo esttico pblico que instancia esta classe se este membro null
(e atribui o valor do membro) e retorna o valor do membro
Adicione o estado do construtor para privado ou protegido de maneira que ningum
poder instanciar a classe diretamente e sobrepor o mecanismo do construtor
esttico

Estrutura genrica do padro


Singleton / Exemplo Java
Singleton
- static instance
- singleton Data

Return instance

+ static getInstance()
+ SingletonOperation()
+ getSingletonData()

public class USTax extends Tax {


private static USTax instance;
private USTax() { }
public static USTax getInstance() {
if (instance== null) instance= new USTax();
return instance;
}
}

Padres de Projeto
Estruturais
- Adapter

Bridge
- Composite
- Decorator
- Faade
- Flyweight
- Proxy
-

Adapter
Converte a interface de uma classe em
outra interface esperada pelos clientes
Permite que certas classes trabalhem em
conjunto, pois de outra forma seria
impossvel por causa de suas interfaces
incompatveis
Exemplo:

Wrapper usado para adaptar a interface de


classes

Adapter

Supondo que eu tenha:

E queira adicionar...

Utilizando Adapter (reuso da classe XXCircle)

Bridge

Separa uma abstrao da sua


implementao, de modo que as duas
possam variar independentemente

Composite

Compe objetos em estrutura de rvore para


representar hierarquias do tipo partes-todo
Permite que os clientes da estrutura tratem objetos
individuais e composies de objetos de maneira
uniforme

Composite

Decorator
Atribui responsabilidades adicionais a um
objeto dinamicamente
Fornece uma alternativa flexvel
utilizao de subclasses para a extenso
de funcionalidades
Permite a criao de uma cadeia de
objetos que iniciam com o objeto
decorator, o objeto responsvel pela nova
funcionalidade e termina com o objeto
original

Decorator

Exemplo

Then myFactory.getComponent returns


return( new Header1( new Footer1 ( new
SalesTicket())));

O padro Facade

Objetivo
Desejamos simplificar como usar um sistema existente,
precisamos definir a nossa prpria interface

Problema
Precisamos utilizar apenas uma parte de um sistema complexo
ou precisamos interagir com o sistema de uma maneira em
particular

Soluo
A Facade apresenta uma nova interface para o cliente de um
sistema existente

Consequncias
A Facade simplifica o uso do subsistema requerido
Como ela no completa, certas funcionalidades podem no
estar disponveis para o cliente

Implementao
Define uma nova classe (ou classes) que possui a interface
necessria
Esta nova classe utiliza o sistema existente

O padro Facade
Facade
Classes do subsistema

Exemplo de Facade Antes


Cliente A
Database

Cliente B

Model

Element

Exemplo de Facade Depois


Cliente B

Cliente A
Database Facade

Element

Model

Database

Flyweight e Proxy

Flyweight
Usa compartilhamento para suportar grandes
quantidades de objetos, de granularidade fina, de
maneira eficiente
Empregado em sistemas com grande nmero de
objetos

Proxy
Fornece um objeto representante ou um
marcador de outro objeto para controlar o
acesso ao mesmo
Empregado em algumas implementaes de
CORBA

Padres de Projeto
Comportamentais
Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
-

Chain of Responsibility
Evita o acoplamento entre o remetente
de uma solicitao e o destinatrio da
solicitao, dando a mais de um objeto a
chance de tratar a solicitao
Encadeia os objetos receptores e passa a
solicitao ao longo da cadeia at que um
objeto a trate
Utilizado no tratamento de eventos de
usurios

Chain of Responsibility

Command

Encapsula uma solicitao como um objeto, permitindo


a parametrizao de clientes com diferentes
solicitaes, o enfileiramento e o registro de
solicitaes e o suporte a operaes que possam ser,
por exemplo, desfeitas
Utilizado para da suporte a desfazer

Interpreter
Dada uma linguagem, define uma
representao para sua gramtica
juntamente com um interpretador que
usa a representao para interpretar
sentenas nesta linguagem
Utilizado para interpretar uma linguagem
com uma rvore sinttica abstrata, como
em compiladores de linguagens orientadas
a objetos

Iterator
Fornece uma maneira de acessar
sequencialmente os elementos de um
objeto agregado sem expor sua
representao subjacente
Utilizado, por exemplo, na C++ Standard
Template Library

Iterator

Mediator
Define um objeto que encapsula a
interao entre um conjunto de objetos
Promove o acoplamento fraco ao evitar
que os objetos se refiram explicitamente
uns aos outros, permitindo a variao das
interaes independentemente
Utilizado na arquitetura de aplicaes
Smalltalk

Memento
Sem violar a encapsulao, captura e
externaliza um estado interno de um
objeto, de modo que o mesmo possa
posteriormente ser restaurado para este
estado
Utilizado para armazenar um instantneo
do estado do objeto sem romper sua
encapsulao

O padro Observer

Objetivo
Define uma dependncia um-para-muitos entre objetos de
maneira que quando um objeto muda de estado, todas as suas
dependncias so notificadas e atualizadas automaticamente

Problema
Precisamos notificar uma lista varivel de objetos quando um
evento ocorre

Soluo
Observers delegam a responsabilidade pelo monitoramento de
um evento a um objeto central (Subject)

Consequncias
Subjects podem avisar Observers sobre evento que eles no
precisam conhecer

Implementao
Objetos que precisam ser notificados (Observers) devem ser
associados ao objeto que est observando (Subject) pela
ocorrncia do evento ou que dispara o evento
Quando o evento ocorre, o Subject avisa ao Observer

Estrutura genrica do padro


Observer

Exemplo hard coding

Classe

Responsabilidade

Customer

Quando um cliente adicionado, este objeto ir fazer


uma chamada aos outros objetos para ter a ao desejada

WelcomeLetter

Cria cartas de boas vindas para que os clientes saibam


que foram adicionados ao sistema

AddrVerification

Verifica o endereo de qualquer cliente que o pea

Exemplo com Observer

State

Permite que um objeto altere seu comportamento


quando seu estado interno muda
O objeto parecer ter mudado sua classe
Utilizado em algumas implementaes a pilha TCP/IP

Strategy

Define uma famlia de algoritmos, encapsula cada um


deles e os faz intercambiveis
Permite que o algoritmo varie independentemente dos
clientes que o utilizam
Utilizado em alguns sistemas de otimizao

Template Method

Define o esqueleto de um algoritmo em uma operao,


postergando a definio de alguns passos para
subclasses
Permite que as subclasses redefinam certos passos de
um algoritmo sem mudar sua estrutura
Utilizado em arquiteturas Application/Document/View

Visitor
Representa uma operao a ser
executada sobre os elementos de uma
estrutura de objetos
Permite a definio de uma nova
operao sem mudar as classes dos
elementos sobre os quais opera
Utilizado para executar uma srie de
operaes sobre objetos que possuem
interfaces diferentes, sem poluir a
interface dos mesmos

Referncias

The Gang of Four. Padres de Projeto: Solues


Reutilizveis de Software Orientado a Objetos.
Shalloway, A., Trott, J. R. Design Patterns Explained: A New
Perspective on Object-Oriented Design 2nd ed. Addison
Wesley Professional, 2004.
Deschamps, F. Padres de Projeto: Uma Introduo. S2i,
DAS, UFSC.
Grand, M. Patterns in Java Vol. 1: A Catalog of Reusable
Design Patterns Illustrated with UML 2nd ed. Wiley, 2002.

Padres de Projeto de
Software
Algoritmos e Programao II
Fbio M. Pereira

Вам также может понравиться