Você está na página 1de 17

Padres de Projeto

Prof. Maria Augusta Vieira Nelson


PUC Minas

Prof. Torsten Paul Nelson

Bibliografia
LARMAN, Graig. Utilizando UML e Padroes:Uma introduo a anlise e ao projeto orientados a objetos. Porto Alegre: Bookman, 2a Edio, 2004. captulo 23 Gamma; Helm; Johnson; Vlissides. Padres de Projeto: Solues Reutilizveis de Software Orientado a Objetos. Bookman, 2000
2

Nomenclatura
O termo pattern tem vrias tradues:
padro mas padro tambm a traduo de standard molde bem mais apropriado, mas no usado na literatura

O termo design tambm tem vrias tradues


projeto mas projeto tambm traduo de project desenho feio mas usado.
3

Padres de projeto
O livro Design Patterns (1995) aplicou os conceitos introduzidos por Alexander na Arquitetura civil ao projeto de software
mais especificamente, projeto orientado a objetos

Um dos mais importantes avanos da engenharia de software da dcada de 90.


4

O que um padro de projeto?


H muitas formas de ver:
Uma soluo para um pequeno problema de design OO Um conjunto de relacionamentos entre classes que se considera ter boas qualidades Descries nomeadas de boas heursticas de design OO Um idioma para se falar sobre designs OO Solues para deficincias do paradigma OO, sem inventar novas abstraes
5

DANGER!
Padres de projeto tornam o cdigo mais flexvel
nem sempre isso uma boa coisa evite tornar flexvel o que no precisa ser flexvel hoje.

Padres de projeto tornam o cdigo menos legvel


Muitas partes do cdigo escrito no so relacionadas com o problema sendo resolvido O nmero de classes aumenta Os relacionamentos entre classes se tornam mais complexos

No pra ser programao orientada a padres


o aprendiz usa padres em tudo para aprender como uslos; o graduado usa padres apenas onde so necessrios; o mestre no usa padres; os padres surgem naturalmente em seu cdigo.
6

Trs categorias
Padres de criao
maneiras comuns de se instanciar objetos

Padres estruturais
maneiras comuns de se organizar classes e interfaces

Padres comportamentais
maneiras comuns nas quais objetos interagem

Padres de criao
Factory Method Abstract Factory Builder Prototype Singleton

Padres de criao
Abstraem o processo de instanciao Ajudam a tornar o sistema independente de como objetos so criados Encapsulam conhecimento sobre quais classes concretas o sistema usa Esconde como instncias dessas classes so criadas

Factory Method
Inteno
Definir uma interface para criar um objeto, mas deixar que as subclasses decidam qual classe deve ser instanciada. Permitir que uma classe delegue a instanciao s suas subclasses.

Motivao
Suponha que voc esteja construindo uma aplicao para uma locadora de vdeo que tambm vende fitas. Como acrescentar uma nova fita locadora?
Store AddTape( ) RentalTape SaleTape
10

Tape

Factory Method - Estrutura


Creator FactoryMethod( ) AddObject( )

Product

product = FactoryMethod( )

ConcreteProduct

ConcreteCreator FactoryMethod( )
return new ConcreteProduct

11

Factory Method - Exemplo


Store CreateTape( ) AddTape( )

Tape

tape = CreateTape( )

RentalTape

RentalStore CreateTape( )
return new RentalTape

12

Factory Method - Aplicabilidade


Use o padro Factory Method para
criar instncias quando voc no sabe de antemo a qual classe as instncias vo pertencer permitir que uma classe deixe suas subclasses decidirem quais objetos vo criar

13

Factory Method - Consequncias


Prov ganchos para subclasses
Mais flexvel do que criar objetos diretamente

Conecta hierarquias de classes paralelas


por exemplo, "RentalStore (locadora) a "RentalTape" e "SaleStore" (vendedora) a "SaleTape"
14

Singleton
Inteno
Garantir que uma classe tenha apenas uma instncia

Motivao
Muitas classes devem ter apenas uma instncia escalonadores, window managers, objetos top-level (como a locadora de vdeo) e assim por diante. Deve ser possvel garantir essa restrio.
Singleton static Instance( ) SingletonOperation( ) GetSingletonData( ) static uniqueInstance singletonData
return uniqueInstance

15

Singleton - Exemplo
Store static Instance( ) AddTape( ) GetAddress( ) static uniqueInstance Address
return uniqueInstance

class Store { public: static Store* Instance( ); protected: Store(); private: static Store* uniqueInstance; }

16

Singleton - Exemplo
Store static Instance( ) AddTape( ) GetAddress( ) static uniqueInstance Address
return uniqueInstance

Store* Store::uniqueInstance = 0; Store* Store::Instance( ) { if (uniqueInstance == 0) { uniqueInstance = new Store; } return uniqueInstance; }

17

Singleton - Aplicabilidade
Use o padro Singleton para
garantir que h no mximo uma instncia de uma classe permitir que clientes tenham fcil acesso a essa instncia permitir que a instncia nica seja extensvel atravs de subclasses.

18

Singleton Consequncias
Acesso controlado nica instncia Espao de nomes reduzido
melhor do que variveis globais que guardam instncias nicas

Pode ter subclasses Permite um nmero varivel de instncias Mais flexvel do que operaes de classe
ou seja, mtodos static operaes de classe no podem ser usadas polimorficamente
19

Padres estruturais
Adapter Bridge Composite Decorator Faade Flyweight Proxy

20

Padres estruturais
Lidam com o modo como classes e objetos so compostos para formar estruturas maiores Descrevem formas de se compor objetos para obter funcionalidade nova

21

Adapter
Inteno
Converter a interface de uma classe em outra interface que os clientes esperam. Permitir que classes trabalhem juntas quando no poderiam normalmente devido a interfaces incompatveis.

Motivao

Suponha que voc draw( ) queira reutilizar uma getBoundingBox( ) classe como parte da Polygon sua hierarquia, mas ela no tem a interface que display( ) voc precisa. getBoundaries( ) Circle Rectangle
22

Shape

Adapter (nvel de classes) - Estrutura


Client Target Request( ) Adaptee SpecificRequest( )

Adapter Request( ) SpecificRequest() SpecificRequest( )

23

Adapter - Estrutura
Client Target Request( ) Adaptee SpecificRequest( )

Adapter Request( )

adaptee

adaptee->SpecificRequest( )

24

Adapter - Exemplo
Client Shape draw( ) Polygon Display( )

PolygonAdapter polygon draw( ) polygon->Display( )

25

Adapter - Aplicabilidade
Use o padro adapter para
usar uma classe existente que no tem uma interface que corresponde s suas necessidades

26

Adapter - Consequncias
Adapters (classes)
faz a adaptao usando uma classe adaptadora concreta
no funciona se precisarmos adaptar uma classe e suas subclasses

permite que o adaptador altere o comportamento do adaptado introduz apenas um objeto no requer o uso de pointers (C++)

27

Adapter - Consequncias
Adapter
permite que um nico Adapter funcione com muitos adaptados
o adaptado e todas suas subclasses pode acrescentar funcionalidade a todos os adaptados de uma vez

28

Composite
Inteno
Compor objetos em estruturas de rvore para representar hierarquias parte-todo. Composite permite aos clientes tratarem objetos individuas e compostos de maneira uniforme.

Motivao
Suponha que voc tenha um editor grfico que permita que voc agrupe figuras para compor figuras mais complexas que podem ser manipuladas como figuras primitivas.

29

Composite - Estrutura
Client Component Operation( ) Add(Component) Remove(Component) GetChild(int)

children

Leaf Operation( )

Composite Operation( ) Add(Component) Remove(Component) GetChild(int) forall g in children g.Operation( )

30

10

Composite - Exemplo
Client Graphic Draw( ) Add(Graphic) Remove(Graphic) GetChild(int)

graphics

Circle Draw( )

Picture Draw( ) Add(Graphic g) Remove(Graphic) GetChild(int) forall g in graphics g.Draw( )

31

Composite - Aplicabilidade
Use o padro Composite para
representar hierarquias parte-todo recursivamente permitir aos clientes que ignorem a diferena entre composies de objetos e objetos individuais

32

Composite - Consequncias
Define hierarquias de classes que consistem de objetos primitivos e objetos compostos
sempre que um cliente esperar um objeto primitivo, pode receber um composto

Simplifica os clientes
os cliente no sabem se esto lidando com objetos simples ou compostos.

Facilita a adio de novos tipos de componentes Pode tornar o projeto geral demais
difcil restringir os componentes de um composite.

33

11

Faade
Inteno
Prov uma interface nica para um conjunto de interfaces em um subsistema. Uma faade define uma interface de alto nvel que torna o subsistema mais fcil de usar.

Motivao
Suponha que voc tenha um termostato que regula um ar condicionado baseado em vrios sensores e controladores. desired temp?
Desired Temp Actual Temp Occupancy actual temp? Thermostat

anyone in room?
34

Faade - Estrutura
Client

Faade

35

Faade - Exemplo

Desired Temp Actual Temp Occupancy Room


do_you_need_cool_air( )

Thermostat

36

12

Faade - Aplicabilidade
Use o padro Faade para
fornecer uma interface simples para um subsistema complexo desacoplar um subsistema dos clientes e de outros subsistemas definir um ponto de entrada para cada nvel em uma arquitetura de camadas

37

Faade - Consequncias
Isola clientes de componentes do subsistema
reduz o nmero de objetos com os quais o cliente precisa se comunicar torna o subsistema mais simples de se usar

Promove baixo acoplamento entre o subsistema e seus clientes


possvel mudar os componentes do subsistema sem afetar os clientes

No impede que as aplicaes acessem os componentes se for necessrio


pode-se escolher entre facilidade de uso e generalidade
38

Padres comportamentais
Interpreter Template Method Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor

39

13

Padres comportamentais
Lidam com algoritmos e a distribuio de responsabilidades entre objetos Descrevem os padres de comunicao entre objetos relacionados

40

Strategy
Inteno
Definir uma famlia de algoritmos, encapsular cada um, e torn-los intercambiveis. Esse padro deixa o algoritmo variar de forma independente dos clientes que o utilizam.

Motivao
Em um buffer sncrono, h muitas formas de se lidar com as situaes em que o buffer est vazio ou cheio: pode-se ignorar pedidos, ou bloque-los at que possam ser satisfeitos, ou esperar algum tempo antes de desistir.
Como voc permite que o algoritmo seja escolhido em tempo de execuo?

41

Strategy - Estrutura
Context ContextInterface( )
strategy

Strategy AlgorithmInterface( )

ConcreteStrategyA AlgorithmInterface( )

ConcreteStrategyB AlgorithmInterface( )

42

14

Strategy - Exemplo
BoundedBuffer Read( ) Write( )
empty_buffer

BufferStrategy
full_buffer

Handle( )

if buffer empty { empty_buffer.handle( ); }

PersistentBuffer Drop Read( ) Write( ) Handle( ) Block Handle( ) Timeout Handle( )

43

Strategy - Aplicabilidade
Use o padro Strategy para
configurar uma classe com um de muitos comportamentos possveis ter diversos algoritmos do mesmo tipo esconder estruturas de dados complexas e especficas a determinados algoritmos evitar o uso de comandos condicionais dentro de classes para selecionar um entre vrios comportamentos possveis

44

Strategy - Consequncias
Famlias de algoritmos relacionados
Algoritmos so agrupados em sua prpria hierarquia de classes

Uma alternativa para a herana


Evita o problema de exploso de classes

Elimina comandos condicionais Permite escolha de implementaes Clientes devem estar cientes das estratgias Overhead de comunicao Maior nmero de objetos

45

15

Observer
Inteno
Definir uma dependncia um-para-muitos entre objetos de forma que quando um objeto muda de estado, todos seus dependentes so notificados e atualizados automaticamente.

Motivao
Suponha que voc tem duas formas de aumentar o volume no seu mp3 player usando uma escala deslizante, ou digitando uma percentagem do volume mximo. Como voc garante que uma atualizada se a outra for usada?

46

Observer - Estrutura
Subject Attach(Observer) Detach(Observer) Notify( )
observers

Observer Update( )

for all o in observers { o->Update( ) }

subject

ConcreteSubject GetState( ) SetState( ) subjectState


return subjectState

ConcreteObserver Update( ) observerState

observerState = subject->getState( )

47

Observer - Exemplo
Subject Attach(Observer) Detach(Observer) Notify( )
observers

Observer Update( )

subject

MediaPlayer GetVolume( ) SetVolume( ) volume

VolumeSlider Update( ) level

NumericDisplay Update( ) value

level = subject->getVolume( ) subject


48

16

Observer - Aplicabilidade
Use o padro Observer para
manter dois ou mais aspectos interdependentes de uma abstrao, ao mesmo tempo permitindo que sejam reutilizados independentemente. mudar um objeto causando mudanas em outros objetos, sendo que no se sabe a priori quantos objetos precisam ser mudados. fazer um objeto notificar outros objetos de que seu estado mudou, sem assumir nada sobre os outros objetos.
49

Observer - Consequncias
Acoplamento abstrato entre o sujeito e o observador
O sujeito sabe que tem uma lista de observadores, mas no sabe quem so os observadores.

Suporte para comunicao em broadcast


notificaes so enviadas a todos os objetos interessados

Atualizaes inesperadas
pode ser difcil descobrir exatamente o que mudou no sujeito
50

17

Você também pode gostar