141
1 Padrões de Projeto Este material não substitui a leitura da bibliografia básica Exemplos de código são de cunho didático Especialização em Projeto e Desenvolvimento de Sistemas Prof. MSc.Vagner Figuerêdo de Santan

Padrões de Projeto

Embed Size (px)

DESCRIPTION

Slides usados na disciplina do curso de Especialização em Projeto e Desenvolvimento de Sistemas, da Universidade Presbiteriana Mackenzie.

Citation preview

Page 1: Padrões de Projeto

1

Padrões de Projeto

Este material não substitui a leitura da bibliografia básicaExemplos de código são de cunho didático

Especialização em Projeto e Desenvolvimento de Sistemas

Prof. MSc.Vagner Figuerêdo de Santana

Page 2: Padrões de Projeto

2

Avaliação

Exercícios Lista de exercícios durante a disciplina 1 prova no último dia (nota única) Conceitos

0 <= nota < 3, então E 3 <= nota < 5, então D 5 <= nota < 7, então C 7 <= nota < 9, então B 9 <= nota <= 10, então A

Page 3: Padrões de Projeto

3

Conteúdo programático

Introdução Padrões GRASP (General Responsibility

Assignment Software Patterns) Caps. 17 e 25 do livro do Craig Larman

Padrões GoF (Gang of Four) Todo o livro do Gamma et al.

Page 4: Padrões de Projeto

4

IntroduçãoUm pouco de história Christopher Alexander

A Pattern Language: Towns, Buildings, Constrution (1977)

Gamma et al. Design Patterns: Elements of Reusable

Object-Oriented Software (1994)

Page 5: Padrões de Projeto

5

IntroduçãoUm pouco de história Um padrão descreve

problema que ocorre repetidamente

solução para esse problema de forma que se possa reutilizar a solução

Page 6: Padrões de Projeto

6

IntroduçãoPor quê usar padrões? Aprender com a experiência dos outros O jargão facilita a comunicação de princípios Melhora a qualidade do software Descreve abstrações de software Ajuda a documentar a arquitetura Captura as partes essenciais de forma

compacta

Page 7: Padrões de Projeto

7

IntroduçãoNo entanto, padrões… não apresentam uma solução exata não resolvem todos os problemas de

design não é exclusivo de orientação a objetos

Page 8: Padrões de Projeto

8

IntroduçãoComo selecionar um padrão? Entenda as soluções Estude o relacionamento entre os padrões Estude as similaridades entre os padrões Conheça as principais causas de retrabalho Considere o que pode mudar

Page 9: Padrões de Projeto

9

Padrões GRASP

Information Expert Creator Controller Low Coupling High Cohesion

Polymorphism Pure Fabrication Indirection Protected Variations

Page 10: Padrões de Projeto

10

Padrões GRASPInformation Expert Problema

A quem atribuir a responsabilidade sobre fornecer/manter uma informação?

Solução Atribuir a responsabilidade ao especialista – a

classe que tem a informação necessária

Page 11: Padrões de Projeto

11

Padrões GRASPCreator Problema

Quem deve ser responsável pela criação de objetos?

Solução: B deve ser Creator de A se B agrega objetos de A B contém objetos de A B registra objetos de A B usa de maneira muito próxima objetos de A B tem os dados de inicialização de A

Page 12: Padrões de Projeto

12

Padrões GRASPController Problema

Quem deve ser responsável pelo controlar os eventos do sistema?

Solução: uma classe que represente O sistema como um todo Todo o negócio/organização Algo no mundo real envolvido na tarefa

Page 13: Padrões de Projeto

13

Padrões GRASPController – Facade Controller Centraliza acesso ao sistema em um

controlador Prós

Centralizado Baixo acoplamento na interface Simplicidade

Contras Centralizado Controller tem acoplamento alto Coesão baixa

Page 14: Padrões de Projeto

14

Padrões GRASPController – Role Controller Divide acesso ao sistema de acordo com o

papel dos usuários ou sistemas externos Prós

Coesão melhora Descentralizado Reduz acoplamento do Controller

Contras Pode ser mal balanceado

Page 15: Padrões de Projeto

15

Padrões GRASPController – Use Case Controller Divide acesso ao sistema de acordo os

casos de uso do sistema Prós

Coesão Contras

Acoplamento aumenta Explosão de classes

Page 16: Padrões de Projeto

16

Padrões GRASPLow Coupling O acoplamento (dependência entre

classes) deve ser mantido o mais baixo possível

Como medir acoplamento? Representar o diagrama de classes como um

dígrafo e computar o grau de saída Métrica CK – Coupling Between Objects

(CBO)

Page 17: Padrões de Projeto

17

Padrões GRASPHigh Cohesion A coesão (grau de “relacionamento” entre

as funcionalidades de uma classe) deve ser mantida alta

Como medir coesão? Acúmulo de responsabilidades Coesão entre nome de classes e métodos Métrica CK – Lack of Cohesion On Methods

(LCOM)

Page 18: Padrões de Projeto

18

Padrões GRASPExemplo: Space Invaders

Fonte: http://www.freespaceinvaders.org/

Page 19: Padrões de Projeto

19

Padrões GRASPExemplo: Space Invaders Quem é responsável por

Manter as coordenadas dos alienígenas? Manter as coordenadas das naves? Criar novas naves no início das fases? Controlar pontuação? Controlar movimento dos personagens? Lançar tiros?

Page 20: Padrões de Projeto

20

Padrões GRASPPolymorphism Problema

Quem é responsável quando comportamento varia?

Solução Quando comportamentos relacionados

variam, use operações polimórficas nos tipos onde o comportamento varia

Page 21: Padrões de Projeto

21

Padrões GRASPPure Fabrication Problema

Quem é responsável quando (você está desesperado e) não quer violar alta coesão e baixo acoplamento?

Solução Associe um conjunto coeso de responsabilidades

para uma classe “artificial” (que não representa um conceito do domínio do problema) tento em vista alta coesão, baixo acoplamento e reúso

Page 22: Padrões de Projeto

22

Padrões GRASPIndirection Problema

Como associar responsabilidades para evitar acoplamento direto?

Solução Use um objeto intermediário que faça

mediação entre outros componentes/serviços

Page 23: Padrões de Projeto

23

Padrões GRASPProtected Variations Princípio fundamental de Software Design Problema

Como projetar sistemas de tal forma que variações ou instabilidade não tenham impacto indesejado em outros elementos?

Solução Identificar pontos de variação/instabilidade e usar

uma interface (no sentido mais amplo) estável como ponto de acesso

Page 24: Padrões de Projeto

24

Métricas CK

1. WMC (Weighted Methods per Class)

2. DIT (Depth of Inheritance Tree)

3. NOC (Number of Children)

4. CBO (Coupling Between Objects)

5. RFC (Response for a Class)

6. LCOM (Lack of Cohesion in Methods)

Page 25: Padrões de Projeto

25

Métricas CKCBO Número de classes com a qual uma

determinada classe está acoplada Classes estão acopladas se

métodos de uma classe usam métodos de outra classe atributos de outra classe

Page 26: Padrões de Projeto

26

Métricas CKLCOM Número de interseções vazias entre

métodos de uma classe considerando variáveis usadas

Quanto mais métodos se “parecem” mais coesa é a classe

Em outras palavras, conta quantos pares de métodos não têm “nada a ver”

Page 27: Padrões de Projeto

27

Métricas CKLCOM Exemplo:

Considere uma Classe C com métodos M1 usando variáveis {V1} = {a, b, c, d, e} M2 usando variáveis {V2} = {a, b, e} M3 usando variáveis {V3} = {x, y, z}

E interseção entre {V1}, {V2} e {V3}: {V1} ∩ {V2} = {a, b, e} {V1} ∩ {V3} = {} {V2} ∩ {V3} = {}

Então LCOM de C = 2

Page 28: Padrões de Projeto

28

Padrões GRASPExemplo: Tetris

Page 29: Padrões de Projeto

29

GoF – Criacionais (Capítulo 3)

Singleton Factory Method Abstract Factory Prototype Builder

Page 30: Padrões de Projeto

30

GoF – CriacionaisSingleton Intenção: Garantir que uma classe tenha

somente uma instância e fornecer um ponto de acesso à instancia

Page 31: Padrões de Projeto

31

GoF – CriacionaisSingleton Estrutura:

<<singleton>>Class A

- static instance : Class A

- Class A()+ static getInstance() : Class A

Client

Page 32: Padrões de Projeto

32

GoF – CriacionaisSingleton Exemplo:class Singleton{ private static Singleton instance; private Singleton{ } public static Singleton getInstance(){ if( instance == null ) instance = new Singleton(); return instance; }}

Page 33: Padrões de Projeto

33

GoF – CriacionaisSingleton Use quando:

Deve haver exatamente uma instância da classe

Deve deve ser facilmente acessível aos clientes em um ponto de acesso bem conhecido

Page 34: Padrões de Projeto

34

GoF – CriacionaisFactory Method Intenção: Definir uma interface para

criação de um objeto, mas deixar as subclasses decidirem qual classe instanciar

Page 35: Padrões de Projeto

35

GoF – CriacionaisFactory Method Estrutura:

<<abstract>>Creator

+ factoryMethod()<<abstract>>

ConcreteCreator

+ factoryMethod()

<<abstract>>Product

ConcreteProductcreates

Page 36: Padrões de Projeto

36

GoF – CriacionaisFactory Method Exemplo:abstract class Product{ ...}

class ConcreteProductA extends Product{ ...}

class ConcreteProductB extends Product{ ...}

Page 37: Padrões de Projeto

37

GoF – CriacionaisFactory Method Exemplo:

abstract class Creator{ public abstract Product create();}

class ConcreteCreatorA extends Creator{ public Product create(){ return new ConcreteProductA() ; }}

class ConcreteCreatorB extends Creator{ public Product create(){ return new ConcreteProductB() ; }}

Page 38: Padrões de Projeto

38

GoF – CriacionaisFactory Method Exemplo:class GoFTest{ public static void main( String a[] ){ Creator c ; // If A is needed

c = new ConcreteCreatorA() ; // else c = new ConcreteCreatorB() ; Product p = c.create() ; }}

Page 39: Padrões de Projeto

39

GoF – CriacionaisFactory Method Use quando:

Uma classe não pode antecipar a classe de objetos que precisa criar

Uma classe deseja que suas subclasses especifiquem os objetos que cria

Page 40: Padrões de Projeto

40

GoF – CriacionaisAbstract Factory Intenção: Fornecer interface para criação

de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas

Page 41: Padrões de Projeto

41

GoF – CriacionaisAbstract Factory Estrutura:

<<abstract>>AbstractFactory

+ createA() <<abstract>>+ createB() <<abstract>>

ConcreteFactory1

+ createA()+ createB()

ConcreteFactory2

+ createA()+ createB()

Page 42: Padrões de Projeto

42

GoF – CriacionaisAbstract Factory Use quando:

Um sistema deveria ser independente de como seus produtos são criados, compostos e representados

Um sistema deveria ser configurados com uma ou várias famílias de produtos

Uma família de objetos é destinada a ser usada de maneira única

Page 43: Padrões de Projeto

43

GoF – CriacionaisPrototype Intenção: Especificar os tipos de objetos

a serem criados usando uma instância-protótipo. Novos objetos são criados pela cópia desse protótipo

Page 44: Padrões de Projeto

44

GoF – CriacionaisPrototype Estrutura:

Client Prototype

+ clone()

ConcretePrototype

+ clone()

+ op()

prototype -> clone()

return copy of self

Page 45: Padrões de Projeto

45

GoF – CriacionaisPrototype Exemplo:

GraphicTool

Graphic

+ draw( coord )+ clone()

Staff

+ draw( coord )+ clone()

MusicalNote

+ draw( coord )+ clone()

WholeNote

+ draw( coord )+ clone()

HalfNote

+ draw( coord )+ clone()

Page 46: Padrões de Projeto

46

GoF – CriacionaisPrototype Use quando:

Classes a instanciar são especificadas em tempo de execução

Instâncias de classes podem ter poucas combinações de estado

Page 47: Padrões de Projeto

47

GoF – CriacionaisBuilder Intenção: Separar a construção de um

objeto complexo de sua representação de modo que o mesmo processo de construção possa criar diferentes representações

Page 48: Padrões de Projeto

48

GoF – CriacionaisBuilder Estrutura:

Director<<abstract>>

Builder

+ buildPart()

ConcreteBuilder

+ buildPart()+ getResult()

+ construct()

for( Object o : Collection ) builder -> buildPart()

Product

Director<<abstract>>

Builder

+ buildPart()

ConcreteBuilder

+ buildPart()+ getResult()

+ construct()

for( Object o : Collection ) builder -> buildPart()

Product

Page 49: Padrões de Projeto

49

GoF – CriacionaisBuilder Exemplo:class Director{ ... private Builder b ; b = new ConcreteBuilder() ; for( Object o : Collection ) b.buildPart( o ) ; Product p = b.getResult() ; ...}

Page 50: Padrões de Projeto

50

GoF – CriacionaisBuilder Exemplo:abstract class Builder{ abstract buildPart( Part p );}

class ConcreteBuilder extends Builder{ public Part buildPart( PartA a ){...} public Part buildPart( PartB b ){...} public Product getResult(){...} // Product of A&B is returned}

Page 51: Padrões de Projeto

51

GoF – CriacionaisBuilder Use quando:

O algoritmo para criar um objeto complexo deveria ser independente das partes que compõem o objeto

O processo de construção deve permitir diferentes representações para o objeto que é construídos

Page 52: Padrões de Projeto

52

Exercício

Em duplas ou trios Aplicar padrões vistos até o momento em

Projeto para “Radar” de fiscalização de velocidade

Componentes a considerar Sensor de presença Máquina fotográfica Central Outros (?)

Page 53: Padrões de Projeto

53

GoF – Estruturais (Capítulo 4)

Composite Decorator Proxy Adapter Bridge Facade Flyweight

Page 54: Padrões de Projeto

54

GoF – EstruturaisComposite Intenção: Compor objetos em estruturas

de árvore para representarem hierarquias do tipo todo-parte

Page 55: Padrões de Projeto

55

GoF – EstruturaisComposite Estrutura:

Client

<<abstract>>Component

+ op()+ add( :Component )+ remove( :Component )+ getChild( int )

Leaf

+ op()

Composite

+ op()+ add( :Component )+ remove( :Component )+ getChild( int )

Page 56: Padrões de Projeto

56

GoF – EstruturaisComposite Exemplo:

Client

<<abstract>>Component

+ op()+ add( :Component )+ remove( :Component )+ getChild( int )

File

+ op()

Directory

+ op()+ add( :Component )+ remove( :Component )+ getChild( int )

*

Page 57: Padrões de Projeto

57

GoF – EstruturaisComposite Use quando:

Você quer representar hierarquia de objetos do tipo parte-todo

Você quer que clientes tratem objetos compostos e individuais da mesma forma

Page 58: Padrões de Projeto

58

GoF – EstruturaisDecorator Intenção: Dinamicamente, agregar

funcionalidades a um objeto

Page 59: Padrões de Projeto

59

GoF – EstruturaisDecorator Estrutura:

<<abstract>>Component

ConcreteComponent

+ op()

ConcreteComponent <<abstract>>Decorator

ConcreteDecoratorA ConcreteDecoratorB

+ op()+ addedBehavior()

component.op()

+ op()

- addedState - addedState

+ op()+ addedBehavior()

Page 60: Padrões de Projeto

60

GoF – EstruturaisDecorator Exemplo:abstract class Decorator{ ... private Component component ; public Decorator( Component c ){ component = c ; } ... public void operation(){ component.operation() ; }}

Page 61: Padrões de Projeto

61

GoF – EstruturaisDecorator Exemplo:class GoFTest{ ... Component c = new ConcreteDecoratorA( new ConcreteDecoratorB( new ConcreteComponent())); c.operation(); ...}

Page 62: Padrões de Projeto

62

GoF – EstruturaisDecorator Outro exemplo:Sanduich s = new Hamburguer( new Hamburguer( new Letuce( new Cheese( new SpecialSpice( new Onion( new Pickles( new BreadWithGergelim())))))));

Page 63: Padrões de Projeto

63

GoF – EstruturaisDecorator Use quando:

Deseja adicionar responsabilidades para objetos individuais dinamicamente, de maneira transparente e sem afetar outros objetos

Quando uma hierarquia de subclasses não é prática devido ao grande número de possibilidades (explosão de classes)

Page 64: Padrões de Projeto

64

GoF – EstruturaisProxy Intenção: Fornecer um representante de

um objeto para controlar o acesso ao mesmo

Page 65: Padrões de Projeto

65

GoF – EstruturaisProxy Estrutura:

Client

Subject

+ request()

Proxy

+ request()

RealSubject

+ request()

Proxy.request() usesRealSubject.request()

Page 66: Padrões de Projeto

66

GoF – EstruturaisProxy Exemplo:class RealSubject extends Subject{ ... public request(){ // implementation of the request } ...}

Page 67: Padrões de Projeto

67

GoF – EstruturaisProxy Exemplo:class Proxy extends Subject{ ... public request(){ Subject s = new RealSubject() ; s.request() ; } ...}

Page 68: Padrões de Projeto

68

GoF – EstruturaisProxy Exemplo:class GoFTest{ ... Subject s = new Proxy() ; s.request() ; ...}

Page 69: Padrões de Projeto

69

GoF – EstruturaisProxy Use quando:

Há a necessidade de uma referência sofisticada ou versátil a um objeto (mais do que um simples ponteiro)

Page 70: Padrões de Projeto

70

GoF – EstruturaisAdapter Intenção: Converter a interface de uma

classe em outra que os clientes esperam

Page 71: Padrões de Projeto

71

GoF – EstruturaisAdapter Estrutura (class adapter):

Client

Adapter

+ request()

<<abstract>>Target

+ request()

Adaptee

+ specificRequest()

specificRequest()

Page 72: Padrões de Projeto

72

GoF – EstruturaisAdapter Estrutura (object adapter):

Client

Adapter

+ request()

<<abstract>>Target

+ request()

Adaptee

+ specificRequest()

adaptee.specificRequest()adaptee.specificRequest()

Page 73: Padrões de Projeto

73

GoF – EstruturaisAdapter Exemplo (object adapter):abstract class Target{ public abstract void request();}class Adapter extends Target{ public void request(){ Adaptee a = new Adaptee(); a.specificRequest(); }}

Page 74: Padrões de Projeto

74

GoF – EstruturaisAdapter Use quando:

Deseja usar uma classe existente, mas sua interface não combina com o que precisa

Você precisa criar classes reutilizáveis que cooperem com classes não previstas

Page 75: Padrões de Projeto

75

GoF – EstruturaisFacade Intenção: Fornecer uma interface

unificada para um conjunto de interfaces de um subsistema

Page 76: Padrões de Projeto

76

GoF – EstruturaisFacade Estrutura:

Façadesubsystem classes

Page 77: Padrões de Projeto

77

GoF – EstruturaisFacade Exemplo:

class Facade{ public Response parseRequest( Request r ){ RequestController rc; rc = RequestController.getInstance(); return rc.parse( r ); } public boolean areYouAlive(){ SystemController sc ; sc = SystemController.getInstance() ; return sc.isAlive(); }}

Page 78: Padrões de Projeto

78

GoF – EstruturaisFacade Use quando:

Precisar de uma interface simples para um subsistema complexo

Há muitas dependências entre clientes e classes de implementações de uma abstração

Desejar dividir seu sistema em camadas

Page 79: Padrões de Projeto

79

GoF – EstruturaisBridge Intenção: Desacoplar uma abstração de

sua implementação, de modo que as duas possam variar independentemente

Page 80: Padrões de Projeto

80

GoF – EstruturaisBridge Estrutura:

Client

RefinedAbstraction

+ operation()

<<abstract>>Implementor

+ operationImpl ()

ImplementorA

+ operationImpl ()

ImplementorB

+ operationImpl ()

<<abstract>>Abstraction

+ operation()

Page 81: Padrões de Projeto

81

GoF – EstruturaisBridge Exemplo:

Client

RefinedAbstraction

+ drawRect()

<<abstract>>WindowImpl

+ devDrawLine ()

XWindowImpl

+ devDrawLine ()

PMManager

+ devDrawLine ()

<<abstract>>Window

+ drawRect()

imp.devDrawLine()imp.devDrawLine()imp.devDrawLine()imp.devDrawLine()

Page 82: Padrões de Projeto

82

GoF – EstruturaisBridge Use quando:

Deseja evitar acoplamento permanente entre abstração e sua implementação

Abstração e implementação devem ser extensíveis

Mudanças na implementação não devem ter impactos nos clientes que usam a abstração

Page 83: Padrões de Projeto

83

GoF – EstruturaisFlyweight Intenção: Usar compartilhamento para

suportar eficientemente grandes quantidades de objetos com granularidade fina

Page 84: Padrões de Projeto

84

GoF – EstruturaisFlyweight Estrutura:

Client

Flyweight

ConcreteFlyweight UnsharedConcreteFlwweight

FlyweightFactory

+ getFlyweight(key) + operation(extrinsicState)

+ operation(extrinsicState)+ operation(extrinsicState)

- intrinsicState - allState

if( flyweight[key] exists){ return flyweight[key]} else { create new flyweight; add it to pool of flyweight; return the new flyweight}

Page 85: Padrões de Projeto

85

GoF – EstruturaisFlyweight Exemplo:class FlyweightFactory{ private Flyweight pool[]; public Flyweight getFlyweight(int key){ if( pool[ key ] != null ){ pool[key] = new ConcreteFlyweight(); } return pool[key] ; }}

Page 86: Padrões de Projeto

86

GoF – EstruturaisFlyweight Exemplo:class GoFTest{ ... private fc FlyweightFactory; fc = new FlyweightFactory(); Flyweight f = fc.getFlyweight( Flyweight.A ); f.operation( newState ) ; f.run(); ...}

Page 87: Padrões de Projeto

87

GoF – EstruturaisFlyweight Use quando todos estes forem verdade:

Uma aplicação usa um grande número de objetos Custo de armazenagem é alto (muitos objetos) Boa parte do estado do objeto pode ser extrínseca Muitos grupos de objetos podem ser trocados por

relativamente poucos objetos quando a parte extrínseca é removida

A aplicação não depende da identidade dos objetos, uma vez que serão compartilhados

Page 88: Padrões de Projeto

88

Exercício

Continuar projeto do sistema de fiscalização de velocidade Incorporando padrões estruturais Descrevendo métodos e atributos principais

Page 89: Padrões de Projeto

89

GoF – Comportamentais(Capítulo 5) Template method Interpreter Mediator Chain of responsibility Observer

State Strategy Command Memento Iterator Visitor

Page 90: Padrões de Projeto

90

GoF – ComportamentaisTemplate Method Intenção:

Definir o esqueleto de um algoritmo postergando alguns passos para as subclasses

As subclasses podem redefinir certos passos de um algoritmo sem mudar sua estrutura

Page 91: Padrões de Projeto

91

GoF – ComportamentaisTemplate Method Estrutura:

ConcreteClass

<<abstract>>AbstractClass

+ templateMethod()+ op1() <<abs>>+ op2() <<abs>>

+ op1()+ op2()

public void templateMethod(){ ... op1() ... op2() ...}

Page 92: Padrões de Projeto

92

GoF – ComportamentaisTemplate Method Exemplo:

EuclideanClusterer

<<abstract>>Clusterer

+ doCluster( o )+ getDistance( o ) + updateCentroids()

+ getDistance()+ updateCentroid()

public void doCluster( Object o ){ ... // for all the objects d = getDistance( o ) ; // add to the closest cluster’s centroid ... // after setting clusters to all objects updateCentroids() ; ... // do it untill centroids don’t change}

Abstract methods

Page 93: Padrões de Projeto

93

GoF – ComportamentaisTemplate Method Use quando:

Deseja implementar partes invariantes de um algoritmo uma vez e deixar que subclasses implementem o comportamento que pode variar

Um comportamento comum de subclasses pode ser divido e colocado em uma classe comum para evitar duplicação de código

Desejar controlar extensão de subclasses

Page 94: Padrões de Projeto

94

GoF – ComportamentaisInterpreter Intenção: Dada uma linguagem, definir

uma representação para sua gramática juntamente com um interpretador que usa a representação para interpretar sentenças na linguagem

Page 95: Padrões de Projeto

95

GoF – ComportamentaisInterpreter Estrutura:

Client

<<abstract>>Expression

+ interpret(Context)

TerminalExpression

+ interpret(Context)

NonterminalExpression

+ interpret(Context)

Context

Page 96: Padrões de Projeto

96

GoF – ComportamentaisInterpreter Exemplo:

Client

<<abstract>>SpreadSheetExpression

+ interpret(Context)

NumberExpression

+ interpret(Context)

CellExpression

+ interpret(Context)

Context

Page 97: Padrões de Projeto

97

GoF – ComportamentaisInterpreter Use quando:

Há uma gramática para interpretar e você pode representar sentenças dessa linguagem como árvores abstratas de sintaxe

Funciona melhor quando A gramática é simples Eficiência não é um ponto crítico

Page 98: Padrões de Projeto

98

GoF – ComportamentaisMediator Intenção:

Definir um objeto que encapsula a forma como um conjunto de objetos interage

Promove o baixo acoplamento evitando que objetos façam referência a outros explicitamente

Page 99: Padrões de Projeto

99

GoF – ComportamentaisMediator Estrutura:

ConcreteMediator

<<abstract>>Colleague

ConcreteColleagueA ConcreteColleagueB

<<abstract>>Mediator

Page 100: Padrões de Projeto

100

GoF – ComportamentaisMediator Exemplo:

<<abstract>>UIComponent

SuggestionsList TextField

<<abstract>>Mediator

ConcreteMediator

+ propagate( UIComponent )

+ propagate( UIComponent )+ setList( String )+ getSelection()

+ setText( String )+ getText()

+ changed()

mediator.propagate( this )

Page 101: Padrões de Projeto

101

GoF – ComportamentaisMediator Use quando:

Objetos se comunicam de maneira bem definida, mas complexa

Um objeto tem reúso restrito pois se comunica e referencia muitos objetos

Um comportamento que é distribuído entre várias classes deveria ser customizável sem utilizar muita herança

Page 102: Padrões de Projeto

102

GoF – ComportamentaisChain of Responsibility Intenção:

Evitar acoplamento entre remetente e destinatário de um pedido, dando a mais de um objeto a chance de responder um pedido

Encadeia objetos e passa request até que um deles responda

Page 103: Padrões de Projeto

103

GoF – ComportamentaisChain of Responsibility Estrutura:

Client

Handler

+ handleRequest()

ConcreteHandler1

+ handleRequest()

ConcreteHandler2

+ handleRequest()

- successor

if can handle request{ handle request} else { successor.handleRequest()}

Page 104: Padrões de Projeto

104

GoF – ComportamentaisChain of Responsibility Exemplo:

Client

EventLogger

+ log( Event )

MouseLogger

+ log( Event )

KeyPressLogger

+ log( Event )

- successor

if can log Event{ log Event data} else { successor.log( Event )}

Page 105: Padrões de Projeto

105

GoF – ComportamentaisChain of Responsibility Use quando:

Mais de um objeto pode manipular uma requisição e o handler não é conhecido de antemão. O handler deveria ser associado automaticamente

Você quer enviar uma requisição para vários objetos sem especificar o destinatário explicitamente

O conjunto de objetos que pode manipular uma requisição pode ser especificado dinamicamente

Page 106: Padrões de Projeto

106

GoF – ComportamentaisObserver Intenção: Define uma interdependência

1 para n entre objetos, de forma que quando um objeto muda de estado,todos os seus dependentes são notificados e atualizados

Page 107: Padrões de Projeto

107

GoF – ComportamentaisObserver Estrutura:

ConcreteSubject

<<abstract>>Subject

+ attach( Observer )+ detach( Observer )+ notify()

- state

+ getState()+ setState( state )

<<abstract>>Observer

+ update()

ConcreteObserver

- observerState

+ update()for all o in observres{ o.update() ;}

observerState = subject.getState()

Page 108: Padrões de Projeto

108

GoF – ComportamentaisObserver Exemplo:class ConcreteSubject extends Subject{ private List<Observer> observers ; //N private State state ; ... public void attach( Observer o ){ o.setSubject( this ) ; observers.add( o ) ; } ... (continua)

Page 109: Padrões de Projeto

109

GoF – ComportamentaisObserver Exemplo: public void detach( Observer o ){ o.setSubject( null ) ; observers.remove( o ) ; } public void notify(){ // i is iterator of observers list while(i.hasNext()){ Observer o = i.next() ; o.update() ; } }}

Page 110: Padrões de Projeto

110

GoF – ComportamentaisObserver Exemplo:class ConcreteObserver extends Observer{ private Subject subject ; //1 private State state ; ... public void setSubject( Subject s ){ subject = s ; } public void update(){ state = subject.getState() ; }}

Page 111: Padrões de Projeto

111

GoF – ComportamentaisObserver Exemplo:class GoFTest{ ... public static void main( String args[] ){ // 1 ‘source’ Subject s = new ConcreteSubject() ; // N dependents Observer o1 = new ConcreteObserver() ; s.attach( o1 ) ; Observer o2 = new ConcreteObserver() ; s.attach( o2 ) ; ... }}

Page 112: Padrões de Projeto

112

GoF – ComportamentaisObserver Use quando:

Uma abstração tiver dois aspectos, um dependente do outro. Encapsular esses aspectos em objetos separados possibilita reusá-los independentemente

Uma mudança 1:n ocorre e você não sabe quantos objetos precisam ser alterados

Um objeto precisa notificar outros objetos sem fazer suposições sobre quem eles são

Page 113: Padrões de Projeto

113

GoF – ComportamentaisObserver Considerando o sensor de um radar de

velocidade, o que é mais adequado Mediator ou Observer?

<<colleague>>Sensor

<<colleague>>Camera

<<colleague>>Display

Mediator<<subject>>

Sensor

<<observer>>Camera

<<observer>>Display

Page 114: Padrões de Projeto

114

GoF – ComportamentaisState Intenção: Permite a um objeto alterar seu

comportamento quando seu estado interno muda. O objeto parecerá ter “mudado de classe”

Page 115: Padrões de Projeto

115

GoF – ComportamentaisState Estrutura:

<<abstract>>State

+ handle ()

ConcreteStateA

+ handle ()

ConcreteStateB

+ handle()

Context

+ request()

state.handle()

Page 116: Padrões de Projeto

116

GoF – ComportamentaisState Exemplo:class Sensor{ private State state ; public setState( State s ){ state = s ; } public int trackSpeed(){ return state.handle( this ) ; }}

Page 117: Padrões de Projeto

117

GoF – ComportamentaisState Exemplo:abstract class State{ abstract void handle( Sensor s ) ;}class CarPassing extends State{ public int handle( Sensor s ){ int speed = s.getSpeed() ; s.setState( new NoCarPassing() ); return speed ; }}

Page 118: Padrões de Projeto

118

GoF – ComportamentaisState Use quando:

O comportamento de um objeto depende do seu estado ele deve mudá-lo em tempo de execução

Operações tem vários fluxos condicionais que dependem do estado do objeto. State coloca cada um desses fluxos em uma classe separada

Page 119: Padrões de Projeto

119

GoF – ComportamentaisStrategy Intenção:

Define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis

Strategy permite que o algoritmo varie independentemente dos clientes que a utilizam

Page 120: Padrões de Projeto

120

GoF – ComportamentaisStrategy Estrutura:

<<abstract>>Strategy

+ algorithm ()

ConcreteStrategyA

+ algorithm ()

ConcreteStrategyB

+ algorithm ()

Context

+ contextInterface()

strategy.algorithm()

Page 121: Padrões de Projeto

121

GoF – ComportamentaisStrategy Exemplo:

<<abstract>>Sorter

+ sort ( List )

BubbleSorter

+ sort ( List )

MergeSorter

+ sort ( List )

Context

+ showList()

sorter.sort( List )

Page 122: Padrões de Projeto

122

GoF – ComportamentaisStrategy Use quando:

Várias classes relacionadas diferem somente no comportamento

Precisa de variantes de um certo algoritmo Um algoritmo usa dados que clientes não

precisam ter conhecimento Uma classe define muitos comportamentos

que aparecem em vários fluxos condicionais

Page 123: Padrões de Projeto

123

GoF – ComportamentaisCommand Intenção:

Encapsular uma requisição em um objeto, permitindo

parametrizar clientes enfileirar requisições registrar requisições suportar operações que podem ser desfeitas

Page 124: Padrões de Projeto

124

GoF – ComportamentaisCommand Estrutura:

<<abstract>>Command

+ execute () <<abstract>>

Receiver

+ action ()

ConcreteCommand

+ execute ()

Invoker

Client - state

Page 125: Padrões de Projeto

125

GoF – ComportamentaisCommand Exemplo:

<<abstract>>Command

+ execute () <<abstract>>

Document

+ delete ()+ copy()+ paste()

DeleteCommand

+ execute ()

MenuItem

Application - state

Menu

+ clicked()

command.execute() document.paste()

Page 126: Padrões de Projeto

126

GoF – ComportamentaisCommand Use quando:

Desejar parametrizar objetos com base na ação a ser executada

Desejar especificar filas e executar solicitações em tempos diferentes

Desejar implementar “desfazer” Desejar implementar logging de ações para serem

reaplicadas em sistemas em caso de crash Desejar estruturar um sistema em operações em alto

nível construídas com base em operações primitivas

Page 127: Padrões de Projeto

127

GoF – ComportamentaisMemento Intenção: Sem violar encapsulamento,

capturar e externalizar o estado interno de um objeto de maneira que o objeto possa retornar a esse estado mais tarde

Page 128: Padrões de Projeto

128

GoF – ComportamentaisMemento Estrutura:

Originator

+ setMemento(Memento m)+ createMemento()

CaretakerMemento

- state - state

+ getState()+ setState(State s)

return new Memento(state) state = m.getState()

Page 129: Padrões de Projeto

129

GoF – ComportamentaisMemento Exemplo:

Game

+setCheckpoint(Checkpoint c)+createCheckpoint()

CheckpointControllerCheckpoint

- state - state

+ getState()+ setState(State s)

return new Checkpoint(state) state = c.getState()

Page 130: Padrões de Projeto

130

GoF – ComportamentaisMemento Use quando:

Um snapshot de alguma parte do objeto precisa ser salva para que seja restaurada no futuro; e

Uma interface direta para obter o estado expõe detalhes de implementação e quebraria o encapsulamento do objeto

Page 131: Padrões de Projeto

131

GoF – ComportamentaisIterator Intenção: Fornecer um meio de acessar,

sequencialmente, os elementos de uma agregação sem expor sua representação interna

Page 132: Padrões de Projeto

132

GoF – ComportamentaisIterator Estrutura: <<abstract>>

Iterator

+ first()+ next()+ isDone()+ currentItem()

ConcreteIterator

Client

<<abstract>>Aggregate

+ createIterator()

ConcreteAggregate

+ createIterator() return new ConcreteIterator(this)

Page 133: Padrões de Projeto

133

GoF – ComportamentaisIterator Exemplo: <<abstract>>

Iterator

+ first()+ next()+ isDone()+ currentItem()

BinaryTreeIterator

Client

<<abstract>>AbstractTree

+ createIterator()

BinaryTree

+ createIterator()return new BinaryTreeIterator(this)

Page 134: Padrões de Projeto

134

GoF – ComportamentaisIterator Use quando:

Quiser acessar conteúdo de uma coleção de objetos sem expor sua representação interna

Quiser fornecer uma interface uniforme para navegar em diferentes estruturas de coleções de objetos (suportar iteração polimórfica)

Page 135: Padrões de Projeto

135

GoF – ComportamentaisVisitor Intenção:

Representar uma operação a ser executada nos elementos de uma estrutura de objetos.

Visitor permite definir uma nova operação sem mudar a classe dos elementos sobre os quais opera

Page 136: Padrões de Projeto

136

GoF – ComportamentaisVisitor Estrutura:

<<abstract>>Visitor

+ visitElement(ConcreteElement)

ConcreteVisitor

Client

<<abstract>>Element

+ accept( Visitor )

ConcreteElement

+ accept ( Visitor v )+ op() v.visitConcreteElement( this )

ObjectStructure

Page 137: Padrões de Projeto

137

GoF – ComportamentaisVisitor Exemplo:

<<abstract>>Visitor

+ visitNode(ConcreteNode)+ visitNode(OtherConcreteNode)

NodeVisitor

Client

<<abstract>>Node

+ accept( Visitor )

ConcreteNode

+ accept ( Visitor v )+ op() v.visitNode( this )

Graph

Page 138: Padrões de Projeto

138

GoF – ComportamentaisVisitor Use quando:

A estrutura de um objeto contém muitas classes de objetos com interfaces diferentes e você deseja realizar operações nesses objetos

Operações diferentes e não relacionadas precisam ser aplicadas em uma estrutura de objetos e você não deseja “poluí-los” com essas operações

Classes definindo estruturas raramente mudam, mas comumente você deseja definir novas operações nessa estrutura

Page 139: Padrões de Projeto

139

GoFRelacionamento entre padrões

Builder Iterator

Composite

Decorator

Flyweight

Visitor

SingletonFacade

Abstract Factory

Prototype

Factory Method

Template Method

Strategy

StateInterpreter

Chain of Responsibility

ProxyAdapter

BridgeCommand

Memento

ObserverMediator

Page 140: Padrões de Projeto

140

Exercício

Finalizar projeto do sistema de fiscalização de velocidade para apresentação na próxima aula 20min por grupo 10min de discussões

Page 141: Padrões de Projeto

141

Referências

Chidamber & Kemerer A Metrics Suite for Object Oriented Design

Gamma et al.Design Patterns: Elements of Reusable Object-Oriented Software (1994)

LarmanApplying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition)