Top Banner
1
141

Detalhamento dos Padrões - Estrutura

Jan 01, 2016

Download

Documents

jaime-tillman

Detalhamento dos Padrões - Estrutura. Padrão Bridge Possui estrutura similar ao Padrão Adapter, mas possui outra finalidade: separar a interface de sua implementação para que possam ser alteradas independentemente; O Adapter serve para alterar a interface de um objeto já existente; - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Detalhamento dos Padrões - Estrutura

1

Page 2: Detalhamento dos Padrões - Estrutura

2

Detalhamento dos Padrões - Estrutura

Padrão Bridge Possui estrutura similar ao Padrão

Adapter, mas possui outra finalidade: separar a interface de sua implementação para que possam ser alteradas independentemente;

O Adapter serve para alterar a interface de um objeto já existente;

O Bridge tem a função de desacoplar uma abstração de sua implementação;

Page 3: Detalhamento dos Padrões - Estrutura

3

Detalhamento dos Padrões - Estrutura

Padrão Bridge Problema

Quando uma abstração pode ter uma entre várias implementações possíveis, a maneira usual de utilizá-las é através da herança: Classe Abstrata define a interface para

abstração; Subclasses Concretas implementam a

classe abstrata de formas diferentes; Logo, teremos abordagem pouco flexível

em virtude da ligação da herança com a implementação;

Page 4: Detalhamento dos Padrões - Estrutura

4

Detalhamento dos Padrões - Estrutura

Padrão Bridge Problema

Page 5: Detalhamento dos Padrões - Estrutura

5

Detalhamento dos Padrões - Estrutura

Padrão BridgeSolução com Bridge

Page 6: Detalhamento dos Padrões - Estrutura

6

Detalhamento dos Padrões - Estrutura

Padrão BridgeEstrutura

Page 7: Detalhamento dos Padrões - Estrutura

7

Detalhamento dos Padrões - Estrutura

Padrão Bridge Participantes

Abstraction : Define a interface de abstração. Mantém uma referência a um objeto do tipo Implementor.

RefinedAbstraction : Estende a interface definida por Abstração.

Implementor : Define a interface para classes de implementação. Esta não tem a obrigação de corresponder exatamente à interface de abstração. De fato, as duas interfaces podem ser bastante diferentes. Tipicamente, a interface de implementação fornece apenas operações primitivas, cabendo à abstração a responsabilidade de definir operações de alto nível baseadas nestas primitivas.

ConcreteImplementatorA e ConcreteImplementatorB : Implementação concreta da interface definida por Implementor.

Page 8: Detalhamento dos Padrões - Estrutura

8

Detalhamento dos Padrões - Estrutura

Padrão BridgeAplicabilidade Quando for necessário evitar uma ligação

permanente entre a interface e a implementação.

Quando alterações na implementação não puderem afetar clientes.

Quando implementações são compartilhadas entre objetos desconhecidos do cliente.

Page 9: Detalhamento dos Padrões - Estrutura

9

Detalhamento dos Padrões - Estrutura

Padrão BridgeConseqüências Detalhes de implementação totalmente

inacessíveis aos clientes. Eliminação de dependências em tempo de

compilação das implementações. Implementação de abstração pode ser

configurada em tempo de execução.

Page 10: Detalhamento dos Padrões - Estrutura

10

Detalhamento dos Padrões - Estrutura

Padrão BridgeCódigo Fonte – Exemplo...

Page 11: Detalhamento dos Padrões - Estrutura

11

Detalhamento dos Padrões - Estrutura

Padrão DecoratorClassificação: Padrão de Objeto Anexar responsabilidades adicionais a

um objeto dinamicamente. Os Decorators oferecem uma

alternativa flexível ao uso de herança para estender uma funcionalidade;

Page 12: Detalhamento dos Padrões - Estrutura

12

Detalhamento dos Padrões

Padrão DecoratorProblema A primeira idéia é criar subclasses que

implementem as funcionalidades desejadasListaSincronizadaListaComEventosListaNaoModificavel

Page 13: Detalhamento dos Padrões - Estrutura

13

Detalhamento dos Padrões

Padrão DecoratorProblema Mas e se desejarmos mais de uma

funcionalidade ao mesmo tempo? Nesse caso teremos uma explosão de

classes. As novas classes (além das 3 anteriores) poderiam ser chamadas: ListaNaoModificavelSincronizada ListaComEventosNaoModificavel ListaComEventosSincronizada ListaComEventosNaoModificavelSincronizada

Page 14: Detalhamento dos Padrões - Estrutura

14

Detalhamento dos Padrões

Padrão DecoratorProblemaEssa solução tem alguns problemas:

Torna a hierarquia bastante complexa;

O número de classes cresce 2^n – 1, onde n são as funcionalidades;Isso significa que com apenas 5 funcionalidade, teríamos 31 classes de Lista.

Page 15: Detalhamento dos Padrões - Estrutura

15

Detalhamento dos Padrões - Estrutura

Padrão Decorator Problema

Necessidade de adicionar responsabilidades aos objetos, com a impossibilidade de criar extensões das subclasses;

Às vezes é até possível realizar um grande número de extensões independentes, mas podem causar uma explosão de subclasses para suportar todas as combinações;

Page 16: Detalhamento dos Padrões - Estrutura

16

Detalhamento dos Padrões

Padrão DecoratorObjetivo Adicionar responsabilidades a um objeto

Dinamicamente; Decoradores oferecem uma alternativa à

herança para estender funcionalidade

Page 17: Detalhamento dos Padrões - Estrutura

17

Detalhamento dos Padrões

Padrão DecoratorMotivação

Algumas vezes queremos adicionar responsabilidades a objetos individuais e não a uma classe inteira;

As vezes as responsabilidades mudam ou aumentam com o tempo e isso requer uma solução flexível.

Page 18: Detalhamento dos Padrões - Estrutura

18

Detalhamento dos Padrões - Estrutura

Padrão Decorator

Page 19: Detalhamento dos Padrões - Estrutura

19

Detalhamento dos Padrões - Estrutura

Padrão Decorator Participantes

Componente: define a interface para objetos que podem ter responsabilidades acrescentadas a eles dinamicamente;

ConcreteComponente: define um objeto para o qual responsabilidades adicionais podem ser atribuídas;

Decorator: mantém uma referência para um objeto Componente e define uma interface que segue a interface Componente;

ConcreteDecoratorN: acrescenta responsabilidades ao componente;

Page 20: Detalhamento dos Padrões - Estrutura

20

Detalhamento dos Padrões - Estrutura

Padrão Decorator

Page 21: Detalhamento dos Padrões - Estrutura

21

Detalhamento dos Padrões - Estrutura

Padrão Decorator

Page 22: Detalhamento dos Padrões - Estrutura

22

Detalhamento dos Padrões - Estrutura

Padrão DecoratorAplicabilidade

Utilizado para adicionar responsabilidades a objetos individuais de forma dinâmica e transparente, isto é, sem afetar outros objetos, da mesma forma, quando se quer retirar responsabilidades;

Quando a utilização de heranças para a implementação do mesmo afetará a flexibilidade do sistema;

Page 23: Detalhamento dos Padrões - Estrutura

23

Detalhamento dos Padrões - Estrutura

Padrão DecoratorConseqüências

Fornece uma flexibilidade maior do que a herança estática.

Evita a necessidade de colocar classes sobrecarregadas de recursos em uma posição mais alta da hierarquia.

Simplifica a codificação permitindo que você desenvolva uma série de classes com funcionalidades específicas, em vez de codificar todo o comportamento no objeto.

Aprimora a extensibilidade do objeto, pois as alterações são feitas codificando novas classes.

Page 24: Detalhamento dos Padrões - Estrutura

24

Detalhamento dos Padrões - Estrutura

Padrão Decorator Código Fonte – Exemplo ...

Page 25: Detalhamento dos Padrões - Estrutura

25

Detalhamento dos Padrões - Comportamentais

Padrão InterpreterClassificação: Padrão de Classe Dada uma linguagem, define uma

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

A estrutura do padrão deve definir a gramática da linguagem e sua implementação deve permitir a interpretação das sentenças que respeitam a gramática definida;

Page 26: Detalhamento dos Padrões - Estrutura

26

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter Pode ser utilizado para representar e

resolver problemas que possam ser expressos sob a forma de uma linguagem formal simples;

Page 27: Detalhamento dos Padrões - Estrutura

27

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter Solução

Símbolos Terminais

Símbolo Não

Terminal

Page 28: Detalhamento dos Padrões - Estrutura

28

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter ExpressãoAbstrata: fornece a interface comum a

todos os nós da árvore; Expressão Completa: implementa a operação de

interpretação para os símbolos terminais; Expressão Incompleta: implementa a operação de

interpretação para os símbolos não terminais; A operação de interpretação é chamada

recursivamente e a base da recursão é um símbolo terminal;

Contexto: contém informações globais ao interpretador, tal como o resultado das operações realizadas;

Cliente: constrói a árvore sintática abstrata a partir de instâncias de nós terminais e não-terminais;

Page 29: Detalhamento dos Padrões - Estrutura

29

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter

Resultado

Page 30: Detalhamento dos Padrões - Estrutura

30

Detalhamento dos Padrões - Comportamentais

Padrão InterpreterAplicabilidade

Quando existir uma linguagem para interpretar;

Gramáticas simples. Em gramáticas complexas use um parser;

Page 31: Detalhamento dos Padrões - Estrutura

31

Detalhamento dos Padrões - Comportamentais

Padrão InterpreterConseqüências

Facilidade em modificar e estender a linguagem;

Gramáticas complexas são difíceis de manter;

Adiciona novas formas de interpretar as expressões;

Page 32: Detalhamento dos Padrões - Estrutura

32

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter

Page 33: Detalhamento dos Padrões - Estrutura

33

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter

Page 34: Detalhamento dos Padrões - Estrutura

34

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter

Page 35: Detalhamento dos Padrões - Estrutura

35

Detalhamento dos Padrões - Comportamentais

Padrão Interpreter

Page 36: Detalhamento dos Padrões - Estrutura

36

Detalhamento dos Padrões - Comportamentais

Padrão Template MethodClassificação: Padrão de Classe Define o esqueleto de um algoritmo numa

operação, deixando que subclasses completem algumas das etapas;

Permite que subclasses redefinem determinadas etapas de um algoritmo sem alterar a estrutura do algoritmo;

Subclasses fazem override das operações para prover um comportamento concreto;

Este padrão é a base para a construção de frameworks.

Page 37: Detalhamento dos Padrões - Estrutura

37

Detalhamento dos Padrões - Comportamentais

Padrão Template MethodEstrutura

Page 38: Detalhamento dos Padrões - Estrutura

38

Detalhamento dos Padrões - Comportamentais

Padrão Template MethodParticipantes

ClasseAbstrata: Define operações abstratas que as subclasses concretas definem para implementar certas etapas do algoritmo; Implementa um Template Method definindo o esqueleto de um algoritmo: O Template Method chama várias operações, entre as

quais as operações abstratas da classe;

ClasseConcreta: Implementa as operações abstratas para desempenhar as etapas do algoritmo que tenham comportamento específico a esta subclasse

Page 39: Detalhamento dos Padrões - Estrutura

39

Detalhamento dos Padrões - Comportamentais

Padrão Template Method Aplicabilidade Quando a estrutura fixa de um algoritmo puder ser definida

pela superclasse deixando certas partes para serem preenchidos por implementações que podem variar;

Para implementar partes que não variam de um algoritmo uma única vez e deixar subclasses implementarem o comportamento variável;

Quando um comportamento comum entre as subclasses deveria ser decomposto e localizado numa classe comum para evitar duplicação É um passo freqüente de "refactoring" de código

Primeiro identifique as diferenças; Coloque as diferenças em novos métodos; Substitua o código das diferenças por uma chamada a um dos

novos métodos;

Page 40: Detalhamento dos Padrões - Estrutura

40

Detalhamento dos Padrões - Comportamentais

Padrão Template MethodConseqüências Template Methods constituem uma das

técnicas básicas de reuso de código; São particularmente importantes em

frameworks e bibliotecas de classes para o fatoramento de comportamento comum;

Deve explicitamente dizer quais os métodos que DEVEM ser sobrescritos e os que PODEM ser sobrescritos;

Page 41: Detalhamento dos Padrões - Estrutura

41

Detalhamento dos Padrões - Comportamentais

Padrão Template MethodExemplo – Código Fonte JAVA...

Page 42: Detalhamento dos Padrões - Estrutura

42

Detalhamento dos Padrões - Comportamentais

Padrão Chain of ResponsabilityClassificação: Padrão de Objeto Permite que uma requisição passe por

uma corrente de objetos até encontrar um que a processe;

Evita acoplar o remetente de um requisição ao seu destinatário ao dar a mais de um objeto a chance de servir a requisição. Compõe os objetos em cascata e passa a requisição pela corrente até que um objeto a sirva;

Page 43: Detalhamento dos Padrões - Estrutura

43

Detalhamento dos Padrões - Comportamentais

Padrão Chain of ResponsabilityMotivação: Uma máquina de refrigerantes necessita

armazenar em locais diferentes cada tipo de moeda possível.

Pode ser útil que um objeto receba a moeda, mas se ele não for capaz de armazenar no local correto, passe-o para outro objeto buscando a colocação correta da moeda.

Isso é um exemplo de tentativa de desacoplamento, já que se alguém não pode resolver determinada tarefa ocorre uma delegação da responsabilidade para outro objeto de forma totalmente transparente.

Page 44: Detalhamento dos Padrões - Estrutura

44

Detalhamento dos Padrões - Comportamentais

Padrão Chain of Responsability

• Permitir que vários objetos possam servir a uma requisição ou repassá-la;• Permitir divisão de responsabilidade de forma transparente;

[Argonavis]

Page 45: Detalhamento dos Padrões - Estrutura

45

Detalhamento dos Padrões - Comportamentais

Padrão Chain of Responsability

[Argonavis]

Page 46: Detalhamento dos Padrões - Estrutura

46

Detalhamento dos Padrões - Comportamentais

Padrão Chain of ResponsabilityProcessador: define a interface

para as solicitações; implementa a referência ao sucessor;

ProcessadorConcreto: trata as solicitações pelas quais ele é responsável; pode acessar seu sucessor, caso não consiga processar a informação;

Cliente: inicia a solicitação para um objeto do tipo ProcessadorConcreto;

[Argonavis]

Page 47: Detalhamento dos Padrões - Estrutura

47

Detalhamento dos Padrões - Comportamentais

Page 48: Detalhamento dos Padrões - Estrutura

48

Detalhamento dos Padrões - Comportamentais

Padrão Chain of Responsability

[Argonavis]

Page 49: Detalhamento dos Padrões - Estrutura

49

Detalhamento dos Padrões - Comportamentais

Padrão Chain of ResponsabilityExemplo:

Mecanismo de Exceção em Java;Quando ocorre um erro em uma classe

a máquina virtual verifica se a classe possui o tratamento de exceção;Caso não possua, a classe pode indicar que a exceção pode ser tratada pela classe que a chamou;

A cadeia é construída em tempo de execução;

[Argonavis]

Page 50: Detalhamento dos Padrões - Estrutura

50

Detalhamento dos Padrões - Comportamentais

Padrão Chain of Responsability

Aplicabilidade: Mais de um objeto pode tratar de um pedido, e o

tratador de pedidos (processador) não é conhecido a priori. O processador deve ser buscado automaticamente de forma ascendente;

Você quer emitir um pedido para um de vários objetos sem especificar o recebedor de forma explícita;

O conjunto de objetos que pode tratar de um pedido deve ser configurado dinamicamente.

Page 51: Detalhamento dos Padrões - Estrutura

51

Detalhamento dos Padrões - Comportamentais

Padrão Chain of ResponsabilityConseqüências: Acoplamento reduzido:

Evita que um objeto (client) seja forçado a tomar conhecimento do outro (processador);

O objeto só precisa saber que o pedido foi tratado apropriadamente;

A estrutura da cadeia não precisa ser conhecida; Flexibilidade na atribuição de responsabilidades

para objetos (subclasses, alteração dinâmica da cadeia);

Sucesso no tratamento do pedido não é garantido.

Page 52: Detalhamento dos Padrões - Estrutura

52

Detalhamento dos Padrões - Comportamentais

Padrão Chain of Responsability

Código Fonte – Exemplo ...

[Argonavis]

Page 53: Detalhamento dos Padrões - Estrutura

53

Detalhamento dos Padrões - Comportamentais

Padrão CommandClassificação: Padrão de ObjetoEncapsular uma requisição como

um objeto, permitindo que clientes parametrizem diferentes requisições;

[Argonavis]

Page 54: Detalhamento dos Padrões - Estrutura

54

Detalhamento dos Padrões - Comportamentais

Padrão CommandUma aplicação complexa pode

exigir a realização de diversos comandos diferentes;

Algumas vezes é necessário a seleção de objetos sem saber nada sobre a operação que está sendo executada;

[Argonavis]

Page 55: Detalhamento dos Padrões - Estrutura

55

Detalhamento dos Padrões - Comportamentais

Padrão CommandMotivação: Algumas vezes é necessário se fazer uma

solicitação de serviço sem conhecimento algum do tipo de operação que está sendo requerida.

Na construção de um menu, por exemplo. O padrão Command permite que um menu

possa solicitar execução de pedidos sem conhecer a natureza destes pedidos,pois o próprio objeto encapsula os detalhes da execução do pedido.

Page 56: Detalhamento dos Padrões - Estrutura

56

Detalhamento dos Padrões - Comportamentais

Padrão Command

[Argonavis]

Page 57: Detalhamento dos Padrões - Estrutura

57

Detalhamento dos Padrões - ComportamentaisPadrão Command

Comando: define a interface para execução de uma operação;

ComandoConcreto: define um vínculo entre o objeto Receptor e a ação; implementa o executar() a partir das invocações das correspondentes operações do receptor;

Cliente: cria um objeto do tipo ComandoConcreto;

Executor: solicita ao Comando a execução da solicitação;

Receptor: sabe como executar as operações associadas a uma solicitação; qualquer classe pode funcionar como receptor;

Page 58: Detalhamento dos Padrões - Estrutura

58

Detalhamento dos Padrões - Comportamentais

Padrão CommandaReceptor aCliente aComandoConcreto aComando Executor

Page 59: Detalhamento dos Padrões - Estrutura

59

Detalhamento dos Padrões - Comportamentais

Padrão Command

Page 60: Detalhamento dos Padrões - Estrutura

60

Detalhamento dos Padrões - Comportamentais

Padrão CommandAplicabilidade Parametrizar objetos com uma ação a executar. Especificar, armazenar e executar pedidos em

momentos diferentes: Commands podem ser transferidos entre espaços de

endereçamento e máquinas. Suportar undo: a operação execute pode armazenar o

estado para reverter os efeitos do próprio comando. Suportar ‘logs’ de modificações: através da inclusão de

undoable Commands em meio persistente. Estruturar um sistema em torno de operações de alto

nível: constituídas internamente por várias operações primitivas. Facilidades para extensão do sistema.

Page 61: Detalhamento dos Padrões - Estrutura

61

Detalhamento dos Padrões - Comportamentais

Padrão CommandConseqüências Command desacopla o objeto que invoca a

operação daquele que sabe como executá-la. Commands são objetos de primeira classe,

ou seja, podem ser manipulados e estendidos como qualquer outro objeto.

É fácil acrescentar novos Commands porque não é preciso mudar classes existentes.

Page 62: Detalhamento dos Padrões - Estrutura

62

Detalhamento dos Padrões - Comportamentais

Padrão CommandExemplo – Código Java ...

Page 63: Detalhamento dos Padrões - Estrutura

63

Detalhamento dos Padrões - Comportamentais

Padrão IteratorClassificação: Padrão de ObjetoFornece um meio de acessar,

sequencialmente, os elementos, sem expor sua representação interna;

Page 64: Detalhamento dos Padrões - Estrutura

64

Detalhamento dos Padrões - Comportamentais

Padrão IteratorMotivação: Objetos agregados como listas, tabelas hash,

dicionários, por exemplo, devem permitir que se acessem seus elementos de modo abstrato, sem que a representação interna de sua estrutura seja exposta;

Eventualmente também pode se desejar fazer duas travessias concorrentes sobre um mesmo objeto agregado.

O padrão Iterator permite a criação de tais facilidades.

Page 65: Detalhamento dos Padrões - Estrutura

65

Detalhamento dos Padrões - Comportamentais

Padrão Iterator

[Argonavis]

Page 66: Detalhamento dos Padrões - Estrutura

66

Detalhamento dos Padrões - Comportamentais

Padrão IteratorEstrutura

Page 67: Detalhamento dos Padrões - Estrutura

67

Detalhamento dos Padrões - Comportamentais Padrão Iterator Iterator:define a interface para acessar

e percorrer os elementos; ConcreteIterator (ListIterator,

SkipListIterator): implementa interface Iterator; mantém o controle na posição corrente no percurso do agregado;

Aggregate (AbstractList): define uma interface para o objeto iterator;

ConcreteAgregate (List, SkipList): implementa a interface de criação do iterador para retornar uma instância do ConcreteIterator;

Page 68: Detalhamento dos Padrões - Estrutura

68

Detalhamento dos Padrões - Comportamentais

Padrão IteratorAplicabilidade

Se desejar acessar o conteúdo de um objeto agregado sem expor sua representação interna;

Se desejar suportar múltiplas formas de percorrer um objeto agregado;

Se quiser prover uma interface uniforme para percorrer diferentes estruturas agregadas. Suportar iteração polimórfica.

Page 69: Detalhamento dos Padrões - Estrutura

69

Detalhamento dos Padrões - Comportamentais

Padrão IteratorConseqüências

Suporte a variações na maneira de se atravessar um objeto agregado (pre-order, pós-ordem, em-ordem);

Simplificação da interface do agregado;

Mais de um cursor pendente sobre um agregado.

Page 70: Detalhamento dos Padrões - Estrutura

70

Detalhamento dos Padrões - Comportamentais

Padrão IteratorExemplo

Page 71: Detalhamento dos Padrões - Estrutura

71

Detalhamento dos Padrões - Comportamentais

Padrão IteratorCódigo Fonte – Exemplo....

Cast de todos os Objetos Retornados

Page 72: Detalhamento dos Padrões - Estrutura

72

Detalhamento dos Padrões - Comportamentais

Padrão IteratorCódigo Fonte – Exemplo...

Page 73: Detalhamento dos Padrões - Estrutura

73

Detalhamento dos Padrões - Comportamentais

Padrão MediatorClassificação: Padrão de ObjetoPermite encapsular a forma como

os objetos interagem;

Page 74: Detalhamento dos Padrões - Estrutura

74

Detalhamento dos Padrões - Comportamentais

Padrão MediatorProblema: Distribuição de comportamentos entre

diversas classes, com a intenção de melhorar a reusabilidade desses pequenos trechos de código.

Com muitas classes, a complexidade dos relacionamentos aumenta, ou seja, o acoplamento entre objetos fica forte.

Se houver necessidade de alteração de um comportamento, é necessário alterar várias classes.

Page 75: Detalhamento dos Padrões - Estrutura

75

Detalhamento dos Padrões - Comportamentais

Padrão MediatorProblema:

Como permitir que um grupo de objetos se comunique entre si sem que haja acoplamento entre eles?

Como remover o forte acoplamento presente em relacionamentos muitos para muitos?

Como permitir que novos participantes sejam ligados ao grupo facilmente?

Page 76: Detalhamento dos Padrões - Estrutura

76

Detalhamento dos Padrões - ComportamentaisPadrão MediatorSolução: Um objeto Mediador deve encapsular toda a

comunicação entre um grupo de objetos: Cada objeto participante conhece o mediador, mas

ignora a existência dos outros objetos; O mediador conhece cada um dos objetos

participantes: A interface do Mediador é usada pelos

colaboradores para iniciar a comunicação e receber notificações: O mediador recebe requisições dos remetentes; O mediador repassa as requisições aos destinatários; Toda a política de comunicação é determinada pelo

mediador (geralmente através de uma implementação concreta do mediador).

[Argonavis]

Page 77: Detalhamento dos Padrões - Estrutura

77

Detalhamento dos Padrões - Comportamentais

Padrão MediatorSolução:

Introduzir um Mediator; Os objetos podem se comunicar sem se

conhecer; O Mediator centraliza o comportamento;

[Argonavis]

Page 78: Detalhamento dos Padrões - Estrutura

78

Detalhamento dos Padrões - Comportamentais

Padrão MediatorEstrutura:

[Argonavis]

Page 79: Detalhamento dos Padrões - Estrutura

79

Detalhamento dos Padrões - Comportamentais

Padrão Mediator Mediator: define uma interface para a

comunicação com os objetos Colleague; ConcreteMediator:implementa

comportamento cooperativo pela coordenação de objetos Colleague;conhece e mantém seus colleagues;

Colleague: cada casse Colleague conhece seu objeto Mediator; Cada Colleague se comunica com seu mediador sempre que o mesmo se apresentar em uma situação na qual seria necessário se comunicar com outro Colleague;

Page 80: Detalhamento dos Padrões - Estrutura

80

Detalhamento dos Padrões - Comportamentais

Padrão MediatorAplicabilidade:

O reuso for difícil, uma vez que o objeto se comunica ou referencia muitos outros; O mediator simplifica o relacionamento entre os objetos;

Quando o comportamento distribuído entre diversas classes deve ser personalizado sem excesso de subclasses.

Page 81: Detalhamento dos Padrões - Estrutura

81

Detalhamento dos Padrões - Comportamentais

Padrão MediatorConseqüências: Limita hierarquia de subclasses apenas à

classe Mediator; Promove desacoplamento entre Colleagues; Simplifica protocolos entre objetos: muitos-

para-muitos substituido com um-para-muitos;

Abstrai como os objetos cooperam (ajuda a entender o funcionamento dos objetos);

Centraliza comportamento.

Page 82: Detalhamento dos Padrões - Estrutura

82

Detalhamento dos Padrões - Comportamentais

Padrão Mediator Código Fonte – Exemplo ...

Page 83: Detalhamento dos Padrões - Estrutura

83

Detalhamento dos Padrões - Comportamentais

Exercícios

Page 84: Detalhamento dos Padrões - Estrutura

84

Detalhamento dos Padrões - Comportamentais

Padrão Memento Classificação: Padrão de Objeto Sem violar o encapsulamento, capturar e

deixar disponível o estado interno de um objeto para que o objeto possa ter esse estado restaurado posteriormente;

Page 85: Detalhamento dos Padrões - Estrutura

85

Detalhamento dos Padrões - Comportamentais

Padrão Memento Problema:

É preciso guardar informações sobre um objeto suficientes para desfazer uma operação, mas essas informações não devem ser públicas;

[Argonavis]

Page 86: Detalhamento dos Padrões - Estrutura

86

Detalhamento dos Padrões - Comportamentais

Padrão Memento Solução:

Um memento é um pequeno repositório para guardar estado dos objetos Pode-se usar outro objeto, um string, um arquivo

Memento guarda um snapshot no estado interno de outro objeto - a Fonte Um mecanismo de Undo irá requisitar um

memento da fonte quando ele necessitar verificar o estado desse objeto;

A fonte reinicializa o memento com informações que caracterizam seu estado atual;

Só a fonte tem permissão para recuperar informações do memento;

Page 87: Detalhamento dos Padrões - Estrutura

87

Detalhamento dos Padrões - Comportamentais

Padrão Memento Estrutura:

Guarda os mementos da Fonte

Page 88: Detalhamento dos Padrões - Estrutura

88

Detalhamento dos Padrões - Comportamentais

Padrão Memento

Estrutura (Exemplo):

Fonte

Zelador

Page 89: Detalhamento dos Padrões - Estrutura

89

Detalhamento dos Padrões - Comportamentais

Padrão Memento Dinâmica:

Page 90: Detalhamento dos Padrões - Estrutura

90

Detalhamento dos Padrões - Comportamentais

Padrão Memento

Page 91: Detalhamento dos Padrões - Estrutura

91

Detalhamento dos Padrões - Comportamentais

Padrão Memento

Page 92: Detalhamento dos Padrões - Estrutura

92

Detalhamento dos Padrões - Comportamentais Padrão Memento Exemplo:

Implementar Memento em Java pode ser realizado aplicando o encapsulamento de pacotes;

Pacotes pequenos contendo apenas as classes que precisam compartilhar estado;

Page 93: Detalhamento dos Padrões - Estrutura

93

Detalhamento dos Padrões - Comportamentais

Padrão Memento Aplicabilidade:Um snapshot do (parte do) estado

de um objeto precisa ser armazenada para que ele possa ser restaurado ao seu estado original posteriormente;

Uma interface direta para se obter esse estado iria expor detalhes de implementação e quebrar o encapsulamento do objeto;

Page 94: Detalhamento dos Padrões - Estrutura

94

Detalhamento dos Padrões - Comportamentais

Padrão Memento Conseqüências:

Vantagens: O estado do Fonte é guardado fora dele sem a

perda do encapsulamento. O Fonte é simplificado por não ter a

responsabilidade de gerenciamento de estados anteriores.

Desvantagens: O uso de mementos pode ser uma solução cara

(muita memória), dependendo do tamanho e do número de estados a serem salvos.

O Zelador ganha a responsabilidade de deleção dos mementos armazenados.

Page 95: Detalhamento dos Padrões - Estrutura

95

Detalhamento dos Padrões - Comportamentais

Padrão Observer Classificação: Padrão de Objeto Define uma dependência 1-para-n entres

objetos, de modo que quando o estado de um objeto é alterado todos seus dependentes são notificados e atualizados automaticamente.

Page 96: Detalhamento dos Padrões - Estrutura

96

Detalhamento dos Padrões - Comportamentais

Padrão Observer Motivação: Suponha que você deseja fornecer várias visões

distintas de um mesmo objeto que funciona como um repositório de dados;

Cada visão é criada por um objeto observador independente;

Caso cada observador seja diretamente conectado ao repositório, isto criará uma dependência do repositório com relação aos diferentes observadores, o que lhe reduzirá a reusabilidade e flexibilidade;

O padrão Observer descreve uma forma de manutenção destes relacionamentos de modo que observadores e repositórios sejam facilmente substituídos;

Page 97: Detalhamento dos Padrões - Estrutura

97

Detalhamento dos Padrões - Comportamentais

Padrão Observer

Page 98: Detalhamento dos Padrões - Estrutura

98

Detalhamento dos Padrões - Comportamentais

Padrão ObserverEstrutura:

Solicita o cadastro

Cadastra e Remove os Observadores

Page 99: Detalhamento dos Padrões - Estrutura

99

Detalhamento dos Padrões - Comportamentais Padrão Observer Participantes: Sujeito

Conhece seu Observador. Qualquer número de objetos Observadores podem observar um Sujeito; Provê uma interface para acoplar e desacoplar objetos Observadores;

SujeitoConcreto Guarda o estado de interesse para ObservadorConcreto (isto

é observers); Envia uma notificação para seu(s) Observadores(s) quando

seu estado muda; Observador

Define uma interface de atualização para objetos que devem ser notificados sobre mudanças em um Sujeito;

ObservadorConcreto Mantém uma referência para um objeto SujeitoConcreto;

Guarda o estado que deve ficar consistente com o de Sujeito; Implementa o Observador atualizando a interface para manter seu estado consistente com o de Sujeito;

Page 100: Detalhamento dos Padrões - Estrutura

100

Detalhamento dos Padrões - Comportamentais

Page 101: Detalhamento dos Padrões - Estrutura

101

Detalhamento dos Padrões - Comportamentais

Padrão ObserverAplicabilidade: Quando uma abstração apresenta dois aspectos,

um dependente do outro. Encapsulando estes aspectos em objetos separados permite que você os varie e reutilize de forma independente;

Quando uma modificação em um objeto requer modificação em outros, e você não sabe (em tempo de programação) quantos objetos precisam ser modificados;

Quando um objeto deve ser apto a notificar outros objetos sem saber quem são estes objetos. Em outras palavras, quando você os quer fracamente acoplados;

Page 102: Detalhamento dos Padrões - Estrutura

102

Detalhamento dos Padrões - Comportamentais

Padrão ObserverConseqüências:Variação independente de observáveis e

observadores;É fácil adicionar observadores sem

modificar o observável ou os outros observadores;

Suporte a comunicação broadcast;Atualizações inesperadas (caso o

processo de notificação seja simplificado);

Page 103: Detalhamento dos Padrões - Estrutura

103

Detalhamento dos Padrões - Comportamentais

Padrão ObserverExemplo – Código Java...:

Page 104: Detalhamento dos Padrões - Estrutura

104

Detalhamento dos Padrões - Comportamentais

Padrão State Classificação: Padrão de Objeto Permitir a um objeto alterar o seu

comportamento quanto o seu estado interno mudar;

O objeto irá aparentar mudar de classe;

Page 105: Detalhamento dos Padrões - Estrutura

105

Detalhamento dos Padrões - Comportamentais

Padrão State Motivação: Usar objetos para

representar estados e polimorfismo para tornar transparente a execução de tarefas dependentes de estado.

Page 106: Detalhamento dos Padrões - Estrutura

106

Detalhamento dos Padrões - Comportamentais

Padrão State Estrutura:

Page 107: Detalhamento dos Padrões - Estrutura

107

Detalhamento dos Padrões - Comportamentais

Padrão State Participantes:

ContextDefine a interface de interesse para os Clientes;

StateDefine uma interface para encapsulamentos de estados associados ao estado de Context;

ConcreteStateImplementa um comportamento associado com um estado de context;

Page 108: Detalhamento dos Padrões - Estrutura

108

Detalhamento dos Padrões - Comportamentais

Padrão State Problema: Projetar um

computador de bordo. Um objeto, mostrador, com vários

comportamentos: Termômetro, Marcador de distância, Alarme de

Combustível Baixo, Indicador de velocidade média, Indicador de Consumo Médio.

O comportamento do mostrador depende de seu estado determinado por: Acionamento das chaves do painel Andamento do carro (combustível)

Page 109: Detalhamento dos Padrões - Estrutura

109

Detalhamento dos Padrões - Comportamentais

Padrão State Porque usar State:

Objeto (mostrador) tem estados e comportamentos;

Mostrador muda seu estado com base em eventos.

Os estados são claramente identificáveis O comportamento do objeto Mostrador é

dependente de seu estado; Estensibilidade é importante; Facilita separar a determinação do estado do

Mostrador do correspondente comportamento.

Page 110: Detalhamento dos Padrões - Estrutura

110

Detalhamento dos Padrões - Comportamentais

Padrão State Programa:

Page 111: Detalhamento dos Padrões - Estrutura

111

Padrão State

Detalhamento dos Padrões - Comportamentais

Page 112: Detalhamento dos Padrões - Estrutura

112

Detalhamento dos Padrões - Comportamentais

Padrão State Aplicabilidade:O Comportamento do objeto

depende do seu estado e precisa ser alterado em tempo de execução em função desse estado;

Operações que tenham muito código condicional que dependa do estado do objeto;

Page 113: Detalhamento dos Padrões - Estrutura

113

Detalhamento dos Padrões - Comportamentais

Padrão StateConseqüências:

Localização de comportamento específico em um objeto associado a um estado. Facilidade de extensão horizontal;

Transições de estado realizadas de forma explícita.

Page 114: Detalhamento dos Padrões - Estrutura

114

Detalhamento dos Padrões - Comportamentais

Padrão StateCódigo Fonte – Java...:

Page 115: Detalhamento dos Padrões - Estrutura

115

Detalhamento dos Padrões - Comportamentais

Padrão Strategy Classificação: Padrão de ObjetoDefine uma família de algoritmos,

encapsular cada um, e fazê-los intercambiáveis;

Strategy permite que algoritmos variem independentemente entre clientes que os utilizam;

Page 116: Detalhamento dos Padrões - Estrutura

116

Detalhamento dos Padrões - Comportamentais

Padrão Strategy Motivação:

Operações que são comuns a uma série de objetos de classes diferentes, com pequenas variações de comportamento.

Codificar tais métodos nas próprias classes, se tornariam mais complexas e difíceis de manter, além do inconveniente de termos que repetir o mesmo código várias vezes;

A classe no padrão Strategy torna-se uma espécie de agente capaz de selecionar o algoritmo para cada uso solicitados pelas classes clientes.

Page 117: Detalhamento dos Padrões - Estrutura

117

Detalhamento dos Padrões - Comportamentais

Padrão Strategy

Problema:

[Argonavis]

Page 118: Detalhamento dos Padrões - Estrutura

118

Detalhamento dos Padrões - Comportamentais

Padrão StrategyEstrutura:

Page 119: Detalhamento dos Padrões - Estrutura

119

Detalhamento dos Padrões - Comportamentais

Padrão StrategyParticipantes: Strategy (Compositor)

Define uma interface comum para todos os algoritmos suportados. Context usa esta interface para chamar o algoritmo definido por uma ConcreteStrategy;

ConcreteStrategy (SimpleCompositor, TeXCompositor) Implementa o algoritmo usando a interface de Strategy;

Context (Composition) É configurado com um objeto ConcreteStrategy; Mantém uma referência para um objeto Strategy; Pode definir uma interface que permite a Strategy

acessar seus dados;

Page 120: Detalhamento dos Padrões - Estrutura

120

Detalhamento dos Padrões - Comportamentais

Padrão StrategyAplicabilidade: Quando uma classe define muitos

comportamentos; Quando classes relacionadas forem

diferentes apenas no seu comportamento;

Quando você precisar de diferentes variações de um mesmo algoritmo.

Page 121: Detalhamento dos Padrões - Estrutura

121

Detalhamento dos Padrões - Comportamentais

Padrão StrategyConseqüências:

Hierarquias de classes Strategy podem facilitar a criação de comportamentos variados das famílias de algoritmos relacionados.

Strategy é uma alternativa ao uso de subclasses; A classe cliente pode escolher entre as diversas

implementações de comportamento em execução;

Desvantagem: a interface Strategy é compartilhada por todas as ConcreteStrategy fazendo com que implementações simples precisam declarar e receber parâmetros que não precisem.

Page 122: Detalhamento dos Padrões - Estrutura

122

Detalhamento dos Padrões - Comportamentais

Padrão StrategyCódigo Fonte – Java...:

Page 123: Detalhamento dos Padrões - Estrutura

123

Detalhamento dos Padrões - Comportamentais

Padrão Visitor Classificação:Padrão de Objeto Permite a definição de uma nova operação

sem alterar as classes dos elementos nos quais a operação atua;

As classes que definem a estrutura de objetos raramente mudam, mas a adição de novas operações é freqüente: Se as operações fossem colocadas na classes da

estrutura, a mudança seria mais complexa; Visitor permite agrupar operações relacionadas

numa mesma classe;

Page 124: Detalhamento dos Padrões - Estrutura

124

Detalhamento dos Padrões - Comportamentais

Padrão Visitor Problema:

Page 125: Detalhamento dos Padrões - Estrutura

125

Detalhamento dos Padrões - Comportamentais

Padrão Visitor Quando Usar: Uma estrutura de objetos contém muitas classes de

objetos com interfaces diferentes e você deseja realizar operações nestes objetos que dependem das classes concretas;

Muitas operações distintas e não relacionadas devem ser realizadas numa estrutura de objetos e você quer evitar "poluir" as classes com estas operações;

Visitor permite que você agrupe as operações relacionadas numa mesma classe;

As classes que definem a estrutura de objetos raramente muda mas a adição de novas operações é freqüente;

Se as operações fossem colocadas na classes da estrutura, a mudança seria mais complexa;

Page 126: Detalhamento dos Padrões - Estrutura

126

Detalhamento dos Padrões - Comportamentais

Padrão Visitor Visitor Permite:

Plugar nova funcionalidade em objetos sem precisar mexer na estrutura de herança;

Agrupar e manter operações relacionadas em uma classe e aplicá-las, quando conveniente, a outras classes (evitar espalhamento e fragmentação de interesses);

Page 127: Detalhamento dos Padrões - Estrutura

127

Detalhamento dos Padrões - Comportamentais

[Argonavis]

Page 128: Detalhamento dos Padrões - Estrutura

128

Detalhamento dos Padrões - Comportamentais

Page 129: Detalhamento dos Padrões - Estrutura

129

Detalhamento dos Padrões - ComportamentaisPadrão Visitor Visitante: Declara uma operação de visita

para cada classe de ElementoConcreto na estrutura de objetos.

VisitanteConcreto: Implementa cada operação declarada pelo Visitante. O VisitanteConcreto pode acumular estado

durante a varredura da estrutura de objetos. Elemento: Define uma operação accept()

que recebe um Visitante; ElementoConcreto: Implementa uma

operação accept() que recebe um Visitante e chama a operação de visita apropriada deste Visitante;

EstruturaDeObjetos: coleção de objetos;

Page 130: Detalhamento dos Padrões - Estrutura

130

Detalhamento dos Padrões - Comportamentais

Padrão Visitor

Page 131: Detalhamento dos Padrões - Estrutura

131

Detalhamento dos Padrões - Comportamentais

Padrão Visitor

ExemploAntes

Page 132: Detalhamento dos Padrões - Estrutura

132

Page 133: Detalhamento dos Padrões - Estrutura

133

Detalhamento dos Padrões - Comportamentais

Padrão Visitor

Exemplo Depois

Page 134: Detalhamento dos Padrões - Estrutura

134

Page 135: Detalhamento dos Padrões - Estrutura

135

Detalhamento dos Padrões - Comportamentais

Padrão Visitor Aplicabilidade Uma estrutura de objetos contém muitas

classes de objetos com interfaces diferentes e você quer fazer operações nestes objetos que dependem das classes concretas;

Muitas operações distintas e não relacionadas devem ser aplicadas a uma estrutura de objetos e você não quer "poluir" as classes dos objetos com tais operações; um visitante permite que você agrupe as

operações relacionadas e as mantenha numa única classe.

Page 136: Detalhamento dos Padrões - Estrutura

136

Detalhamento dos Padrões - Comportamentais

Padrão Visitor Conseqüências Visitor permite adicionar operações com

facilidade basta adicionar um novo visitante um visitante junta operações relacionadas e separa operações não relacionadas;

Evita espalhar operações relacionadas adicionar novos elementos concretos é difícil cada elemento concreto novo significa uma nova operação abstrata no visitante portanto, use o visitante se as operações mudarem com muito mais frequência do que a estrutura de objetos.

Page 137: Detalhamento dos Padrões - Estrutura

137

Detalhamento dos Padrões - Comportamentais

Exemplo – Código Java

Page 138: Detalhamento dos Padrões - Estrutura

138

Padrões de Projeto - Revisão

Padrões de Criação Padrões que têm a ver com a instanciação de objetos

Abstract Factory - Provê uma interface para criar famílias de objetos relacionados ou interdependentes sem especificar suas classes concretas.

Builder - Separa a construção de um objeto complexo da sua representação de forma que o mesmo processo de construção possa criar representações diferentes.

Factory Method - Define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar. O padrão Factory Method deixa uma classe repassar a responsabilidade de instanciação para subclasses.

Prototype - Especifica os tipos de objetos a criar usando uma instância-protótipo e cria novos objetos copiando este protótipo.

Singleton - Garante que uma classe tenha uma única instância e provê um ponto global de acesso à instância.

Page 139: Detalhamento dos Padrões - Estrutura

139

Padrões de Projeto - Revisão Padrões Estruturais Padrões que têm a ver com a composição de classes ou objetos

Adapter - Converte a interface de uma classe em outra interface com a qual os clientes estão prontos para lidar. O padrão Adapter permite que classes trabalhem conjuntamente apesar de interfaces incompatíveis.

Bridge - Desacopla uma abstração de sua implementação de forma que as duas possam mudar independentemente uma da outra.

Composite - Compõe objetos em estruturas de árvore para representar hierarquias Parte-Todo. O padrão Composite permite que clientes tratem objetos individuais e composições de objetos de uniformemente.

Decorator - Adiciona responsabilidades a um objeto dinamicamente. Decoradores provêem uma alternativa flexível à herança para estender funcionalidade.

Façade – Provê uma interface unificada para um conjunto de interfaces num subsistema. O padrão Façade define uma interface de mais alto nível, deixando o subsistema mais fácil de usar.

Flyweight - Usa o compartilhamento para dar suporte eficiente ao uso de um grande número de objetos de granularidade pequena.

Proxy - Provê um objeto procurador para um outro objeto para controlar o acesso a ele.

Page 140: Detalhamento dos Padrões - Estrutura

140

Padrões de Projeto - Revisão

Padrões de Comportamento Padrões que caracterizam formas de interação entre classes e

objetos Chain of Responsibility - Evita acoplar o enviador de um pedido ao

receptor dando oportunidade a vários objetos para tratarem do pedido. Os objetos receptores são encadeados e o pedido é passado na cadeia até que um objeto o trate.

Command - Encapsula um pedido num objeto, permitindo assim parametrizar clientes com pedidos diferentes, enfileirar pedidos, fazer log de pedidos, e dar suporte a operações de undo.

Interpreter - Dada uma linguagem, define uma representação de sua gramática e um interpretador que usa a representação da gramática para interpretar sentenças da linguagem.

Iterator - Provê uma forma de acessar os elementos de uma coleção de objetos seqüencialmente sem expor sua representação subjacente.

Mediator - Define um objeto que encapsule a forma com a qual um conjunto de objetos interagem. O padrão Mediator promove o acoplamento fraco evitando que objetos referenciem uns aos outros explicitamente e permite que suas interações variem independentemente.

Page 141: Detalhamento dos Padrões - Estrutura

141

Padrões de Projeto - Revisão Padrões de Comportamento Padrões que caracterizam formas de interação entre classes e

objetos Memento - Sem violar o princípio de encapsulamento, captura e

externaliza o estado interno de um objeto de forma a poder restaurar o objeto a este estado mais tarde.

Observer - Define uma dependência um-para-muitos entre objetos de forma a avisar e atualizar vários objetos quando o estado de um objeto muda.

State – Permite que um objeto altere seu comportamento quando seu estado interno muda. O objeto estará aparentemente mudando de classe com a mudança de estado.

Strategy - Define uma família de algoritmos, encapsula cada um, e deixe-os intercambiáveis. O padrão Strategy permite que o algoritmo varie independentemente dos clientes que o usam.

Template Method - Define o esqueleto de um algoritmo numa operação, deixando que subclasses completem algumas das etapas. O padrão Template Method permite que subclasses redefinem determinadas etapas de um algoritmo sem alterar a estrutura do algoritmo.

Visitor - Represente uma operação a ser realizada nos elementos de uma estrutura de objetos. O padrão Visitor permite que se defina uma nova operação sem alterar as classes dos elementos nos quais a operação age.