• Nenhum resultado encontrado

Curso - Padrões de Projeto Módulo 3: Padrões de Estrutura

N/A
N/A
Protected

Academic year: 2021

Share "Curso - Padrões de Projeto Módulo 3: Padrões de Estrutura"

Copied!
81
0
0

Texto

(1)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Vítor E. Silva Souza vitorsouza@gmail.com

http://www.javablogs.com.br/page/engenho http://esjug.dev.java.net

(2)

2

Sobre o Instrutor

 Formação:

 Graduação em Ciência da Computação, com ênfase em

Engenharia de Software, pela Universidade Federal do Espírito Santo (UFES);

 Mestrado em Informática (em andamento) na mesma

instituição.

 Java:

 Desenvolvedor Java desde 1999;

 Especialista em desenvolvimento Web;

 Autor do blog Engenho – www.javablogs.com.br/page/engenho.

 Profissional:

 Consultor em Desenvolvimento de Software Orientado a

Objetos – Engenho de Software Consultoria e Desenvolvimento Ltda.

(3)

Estrutura do Curso

Módulo 1 Introdução

Módulo 2 Padrões de Criação Módulo 3 Padrões de Estrutura

Módulo 4 Padrões de Comportamento

(4)

4

Conteúdo deste módulo

 Introdução;  Adapter;  Bridge;  Composite;  Decorator;  Interceptors / AOP;  Façade;  DAO;  Flyweight;  Proxy;  Conclusões.

(5)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

(6)

6

Estrutura de objetos

Padrões de estrutura: como classes e

objetos se organizam para formar

estruturas maiores?

 Padrões de classe: herança;

 Padrões de objeto: composição:

 Maior flexibilidade pela capacidade de

(7)

Padrões de Estrutura

“Padrões de estrutura com escopo de classe usam herança para compor interfaces ou implementações. Os com escopo de objeto descrevem formas de compor objetos para realizar novas funcionalidades.”

Façade Decorator Composite Bridge Escopo de Objeto Adapter Escopo de Classe

(8)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Adapter

(Adaptador)

(9)

Descrição

Intenção:

 Converter a interface de uma classe em

outra interface esperada pelo cliente. Permite que classes com interfaces incompatíveis possam colaborar.

Também conhecido como:

 Wrapper.

(10)

10

O problema

 Existe uma ferramenta gráfica de texto

pronta, mas o programa de desenho só trabalha com formas.

(11)

A solução

 FormaTexto adapta a classe pronta à

interface esperada pelo programa de desenho.

(12)

12

Estrutura – Padrão de objeto

public void request() {

adaptee.specificRequest(); }

(13)

Estrutura – Padrão de classe

public void request() { specificRequest();

(14)

14

Analogia

Curso J930 – GoF Design Patterns / Argonavis Informática e Consultoria S/C Ltda. http://www.argonavis.com.br/cursos/java/j930/index.html

(15)

Usar este padrão quando...

você quer usar uma classe já pronta

que possui uma interface diferente da

que você precisa;

você quer criar uma classe reutilizável

já prevendo que a situação acima

ocorrerá no futuro.

(16)

16

Vantagens e desvantagens

Adapter de Classe:

 Não funciona bem quando se quer

adaptar uma hierarquia de classes;

 Permite que o adaptador sobrescreva

(17)

Vantagens e desvantagens

Adapter de Objeto:

 Permite o uso de um único adaptador

para uma hierarquia de classes adaptadas;

 É mais difícil sobrescrever funções do

(18)

18

Exemplos em Java

As classes envoltório (Integer,

Boolean, Float, etc.);

Adaptadores de eventos de interface

gráfica (AWT/Swing):

 java.awt.MouseAdapter adapta

java.awt.MouseListener a uma interface mais simples.

(19)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Bridge

(Ponte)

Estrutural / Objeto

(20)

20

Descrição

Intenção:

 Desacoplar uma abstração de sua

implementação para que ambos possam variar independentemente.

Também conhecido como:

 Handle, Body.

(21)

O problema

 Componentes gráficos devem ser

implementados para várias arquiteturas;

 Cada novo componente exige várias

implementações;

 Cada nova arquitetura mais ainda.

(22)

22

A solução

 Janela concentra métodos que utilizam

recursos específicos de plataforma;

 Subclasses utilizam os métodos de Janela

(23)

Estrutura

public void operation() {

impl.operationImpl(); }

(24)

24

Analogia

Non-Software Examples of Software Design Patterns by Michael Duell http://www2.ing.puc.cl/~jnavon/IIC2142/patexamples.htm

(25)

Usar este padrão quando...

quiser evitar uma ligação permanente

entre a abstração e a implementação;

tanto a abstração quanto a

implementação possuem subclasses;

mudanças na implementação não

devem afetar o código do cliente;

sua atual solução gera uma

(26)

26

Vantagens e desvantagens

Desacopla a implementação:

 Podendo até mudá-la em tempo de

execução.

Melhora a extensibilidade:

 É possível extender a abstração e a

implementação separadamente.

Esconde detalhes de implementação:

 Clientes não precisam saber como é

(27)

Exemplos em Java

Drivers JDBC são bridges:

 Connection, Statement, ResultSet, etc.

são abstrações;

 Suas implementações (driver) são

(28)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Composite

(Composto)

Estrutural / Objeto

(29)

Descrição

Intenção:

 Compor objetos em estruturas de árvore

para representar hierarquias todo-parte. Permite que clientes trate objetos

individuais e compostos de maneira uniforme.

(30)

30

O problema

 Existem gráficos que são compostos de

outros gráficos;

 O programa tem que conhecer cada um

(31)

A solução

 A classe abstrata representa tanto gráficos

(32)

32

Estrutura

for (c : children) { c.operation(); }

(33)
(34)

34

Usar este padrão quando...

quiser representar hierarquias

todo-parte;

quiser que clientes ignorem a

diferença entre objetos simples e

objetos compostos.

(35)

Vantagens e desvantagens

 Define hierarquias todo-parte:

 Objetos podem ser compostos de outros objetos

e assim por diante.

 Simplifica o cliente:

 Clientes não se preocupam se estão lidando com

compostos ou individuais.

 Facilita a criação de novos membros:

 Basta estar em conformidade com a interface

comum a todos os componentes.

 Pode tornar o projeto muito genérico:

(36)

36

Transparência x segurança

 Composite viola o princípio de herança:

 Leaf IS-A Component é falso, pois add(),

remove(), etc. não fazem sentido para Leaf.

 Mais transparência (tratamento uniforme);  Menos segurança (checagem de tipos).

 Paliativos (opcionais):

 Defina Component como classe abstrata e seus

métodos com implementação vazia;

 Defina getComposite() para retornar a si mesmo

(37)

Outras preocupações

Direção na navegação:

 Filhos -> pais? Pais -> filhos? 

Ciclos:

 Recursão não pode gerar loops infinitos. 

Multiplicidade:

 Um filho pode ter múltiplos pais? 

Limpeza:

(38)

38

Exemplos em Java

A implementação DOM (org.w3c.dom):

 Componente: Node;

 Um node pode ser o documento, um

elemento (tag), um atributo, uma porção de texto, etc.;

(39)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Decorator

(Decorador)

Estrutural / Objeto

(40)

40

Descrição

Intenção:

 Anexar funcionalidades adicionais a um

objeto dinamicamente. Provê uma alternativa flexível à herança como mecanismo de extensão.

Também conhecido como:

 Wrapper

(41)

O problema

 Adicionar funcionalidade por herança é

(42)

42

A solução

(43)
(44)

44

Estrutura

component.operation();

super.operation(); addedBehavior();

(45)
(46)

46

Usar este padrão quando...

quiser adicionar funcionalidade

dinamicamente e transparentemente;

quiser adicionar funcionalidade que

pode depois ser desativada;

extensão por herança é impraticável

(não disponível ou produziria uma

explosão de subclasses, como no

exemplo).

(47)

Vantagens e desvantagens

 Mais flexibilidade do que herança:

 Podem ser adicionadas/removidas em tempo de

execução;

 Pode adicionar duas vezes a mesma

funcionalidade.

 O decorador é diferente do componente:

 A identidade do objeto não pode ser usada de

forma confiável.

 Muitos objetos pequenos:

(48)

48

BufferedReader

InputStreamReader

Exemplos em Java

Os componentes gráficos de Java

(AWT/Swing) não usam decorator!

Os streams do Java I/O usam:

FileInputStream File Transforma o stream num

reader, que lê dados caractere por caractere. Adiciona um buffer ao leitor para ler dados linha por linha.

(49)

Interceptadores (Interceptors)

Idéia semelhante aos decoradores;

Interceptam uma requisição e podem

executar código antes e/ou depois.

Cliente Servidor

(50)

50

Programação Orientada a

Aspectos (AOP)

AplicacaoA.metodoNegocio1() Iniciar a transação

Acessar banco de dados 1 Commit | Rollback

AplicacaoB.metodoNegocio3() Iniciar a transação

Acessar banco de dados 3 Commit | Rollback AplicacaoA.metodoNegocio2()

Iniciar a transação Acessar banco de dados 2

Commit | Rollback

Mesmo trecho de código espalhado por várias classes

(51)

Programação Orientada a

Aspectos (AOP)

AplicacaoA.metodoNegocio1() Acessar banco de dados 1

AplicacaoB.metodoNegocio3() Acessar banco de dados 3 AplicacaoA.metodoNegocio2()

Acessar banco de dados 2

Aspectos são separados e implementados uma única vez.

Iniciar a transação

(52)

52

Programação Orientada a

Aspectos (AOP)

Cliente AOP Interceptor AplicacaoA metodoNegocio1() metodoNegocio2() Iniciar a transação Commit | Rollback

Interceptador cuida para que aspectos sejam executados.

(53)

Código exemplo – cronômetro

interface Componente { void executarTarefa(); }

class ComponenteConcreto implements Componente {

public void executarTarefa() { Thread.sleep(2000); }

}

class Interceptador implements Componente {

private Componente componente;

public Interceptador(Componente componente) {

this.componente = componente; }

public void executarTarefa() {

long antes = System.currentTimeMillis(); componente.executarTarefa();

long depois = System.currentTimeMillis();

(54)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Façade

(Fachada)

Estrutural / Objeto

(55)

Descrição

Intenção:

 Prover uma interface unificada para um

conjunto de interfaces de um subsistema. Define uma interface de mais alto nível para tornar o uso dos subsistemas mais fácil.

(56)

56

O problema

 Clientes acessam vários subsistemas;

 Mudanças em algum subsistema demandam

(57)

A solução

 Introdução de um objeto fachada que provê

uma interface simplificada e única ao sistema.

(58)

58

(59)
(60)

60

Usar este padrão quando...

quiser prover uma interface simples

para um subsistema complexo;

diminuir a dependência direta entre o

cliente e classes internas do seu

sistema;

desenvolver seu sistema em múltiplas

(61)

Vantagens e desvantagens

Facilita a utilização do sistema:

 Cliente só precisa conhecer a fachada. 

Promove acoplamento fraco:

 Pequenas mudanças no subsistema não

mais afetam o cliente.

Versatilidade:

 Quando necessário, clientes ainda podem

(62)

62

Façade e Singleton

Façade geralmente é implementado

como Singleton;

Pode não ser o caso se o sistema tiver

multiplos usuários e cada um usar uma

fachada separada;

Fachada só com métodos estáticos é

(63)

Data Access Object

O padrão DAO pode ser considerado

uma fachada para o acesso a dados.

Aplicação

ObjetoNegocio

ObjetoNegocioDAO

(64)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Flyweight

(Peso mosca)

Estrutural / Objeto

(65)

Descrição

Intenção:

 Implantar compartilhamento de objetos

de granularidade muito pequena para dar suporte ao uso eficiente de grande

(66)

66

O problema

 Desenvolver um editor de texto onde cada

caractere é representado por um objeto:

 Granularidade muito pequena;

 Não haverá recursos (memória) suficiente para

textos grandes.

public static ... System.out...

for (int i; ... Objeto Linha Objeto Linha p u b l i c . . .

(67)

A solução

 Monta-se um pool de objetos

compartilhados;

 Cada caractere tem um objeto. Com 100

objetos (tabela ASCII) poderíamos montar

System.out.println("Design Patterns");

Pool Flyweight

(68)

68

(69)
(70)

70

Usar este padrão quando...

todas as condições forem verdadeiras:

 A aplicação usa um grande número de

objetos;

 O custo de armazenamento é alto por

causa desta quantidade;

 O estado dos objetos pode ser

externalizado;

 Objetos podem ser compartilhados assim

que seu estado é externalizado;

(71)

Vantagens e desvantagens

Custo x benefício:

 Custo de recuperar o objeto

compartilhado e transferir seu estado externalizado;

(72)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Proxy

(Procurador)

Estrutural / Objeto

(73)

Descrição

Intenção:

 Prover um representante ou ponto de

acesso que controle o acesso a um objeto.

Também conhecido como:

 Surrogate.

(74)

74

O problema

 Considere um editor de texto multimídia

(texto e imagens):

 Carregar todas as imagens do texto assim que

ele é aberto pode demorar;

 Nem todas as imagens aparecem na primeira

página, muitas estão “escondidas” mais abaixo.

(75)

A solução

 Documento instancia um objeto proxy, que

possui referência à imagem;

 Assim que necessário, proxy carrega a

imagem –

lazy loading

.

Documento Texto Abc... Imagem Proxy dimensaoImagem

(76)

76

Estrutura

(77)
(78)

78

Usar este padrão quando...

precisar de um acesso mais versátil a

um objeto do que um ponteiro:

 Remote proxy (acesso remoto);

 Virtual proxy (exemplo da imagem);  Protection proxy (controla acesso).

(79)

Vantagens e desvantagens

Adiciona um nível de separação:

 Transparência na execução de ações de

(80)

80

Dynamic proxy em Java

Introduzido na versão 1.3;

Permite a substituição de objetos por

proxies de forma transparente;

(81)

Curso - Padrões de Projeto

Módulo 3: Padrões de

Estrutura

Vítor E. Silva Souza vitorsouza@gmail.com

http://www.javablogs.com.br/page/engenho http://esjug.dev.java.net

Referências

Documentos relacionados

Foi também mostrado o problema da dimensionalidade no qual a probabilidade de classificação falsa de uma regra de decisão não aumenta na mesma proporção que aumenta o número

A classe Logger usa a variável ativo para indicar se as informações podem ser exibidas, enquanto que a classe Aplicacao é a classe que utiliza dois objetos de tipo Logger..

Nessa mesma reunião, atribuiu-se à "partici- pação " várias características, tais como ser ati- va, consciente, responsável, deliberada, organi- zada e contínua. Para

A seguir, são apresentados os passos necessários para implementação de pool de conexões, utilizando Service Locator.. No diretório META-INF da aplicação, crie um

Na classe de testes, crie objetos Conta e invoque a persistencia da

O Template Method pode definir operações hook em pontos específicos e, portanto, permitindo variações somente nestes

Conhecer as peças, tabuleiro e regras do jogo de xadrez não são suficientes para definir um9.

"agnosia" = "inabilidade de reconhecer (também conhecida como cegueira para feições) era, até muito recentemente, tratada como uma desordem rara da percepção da face,