Vous êtes sur la page 1sur 59

Mdulo I Padres de Projeto GoF

Professores Ismael H F Santos ismael@tecgraf.puc-rio.br Eduardo Bezerra edubezerra@gmail.com

April 08

Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br

Ementa
Padres de Projeto GoF
Introduo Singleton Iterator Factory Method Abstract Factory Command Template Method Adapter Composite Observer MVC
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 2

Bibliografia
Craig Larman, Utilizando UML e Padres, Ed Bookman Eric Gamma, et ali, Padres de Projeto, Ed Bookman Martin Fowler, Analysis Patterns - Reusable Object Models, Addison-Wesley,1997 Martin Fowler, Refatorao - Aperfeioando o projeto de cdigo existente, Ed Bookman

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

Livros
Core Java 2, Cay S. Horstmann, Gary Cornell Volume 1 (Fundamentos) Volume 2 (Caractersticas Avanadas) Java: Como Programar, Deitel & Deitel Thinking in Patterns with JAVA, Bruce Eckel Gratuito. http://www.mindview.net/Books/TIJ/

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

POO-Java

Padres GoF Princpios

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

Padres GoF
Em 1995, Erich Gamma, JohnVlissides, RalphJonhsone RichardHelm descreveram 23 padres que podem ser aplicados ao desenvolvimento de sistemas de software orientados a objetos.
Gamma e seus colaboradores so conhecidos como a Gangue dos Quatro (Gand of Four, GoF).

No so invenes. So documentao de solues obtidas atravs da experincia. Foram coletados de experincias de sucesso na indstria de software, principalmente de projetos em C++ e SmallTalk
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 6

Categorias de padres GoF


Padres de projeto esto relacionados a questes de comportamento de objetos, ciclo de vida de objetos, a interface dos objetos e a relacionamentos estruturais entre os objetos. Padres de Projeto permitem desenvolver software de melhor qualidade uma vez que utilizam eficientemente polimorfismo, herana, modularidade, composio, abstrao para construir cdigo reutilizvel, eficiente, de alta coeso e baixo acoplamento. Ajuda na documentao e na aprendizagem. O conhecimento dos padres de projeto torna mais fcil a compreenso de sistemas existentes.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 7

Categorias de padres GoF


Os padres catalogados pela equipe GoF possuem diversos nomes alternativos: Padres de projeto, Padres GoF ou Design patterns Em funo disso, os padres GoF foram divididos em trs categorias:
Criacionais: tm a ver com inicializao e configurao de objetos. Estruturais: tm a ver com o desacoplamento entre a interface e a implementao de objetos. Comportamentais: tm a ver com interaes (colaboraes) entre sociedades de objetos.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

Categorias de padres GoF

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

Categorias de padres GoF - Metsker


Um padro "GoF" tambm classificado segundo o seu escopo; de classe ou de objeto. Nos padres com escopo de classe os relacionamentos que definem este padro so definidos atravs de herana e em tempo de compilao. Nos padres com escopo de objeto o padro encontrado no relacionamento entre os objetos definidos em tempo de execuo. Metsker classifica os pades GoF em 5 grupos, por inteno (problema a ser solucionado):
(1) oferecer uma interface, (2) atribuir uma responsabilidade, (3) realizar a construode classes ou objetos (4) controlar formas de operao (5) implementar uma extensopara a aplicaoPadres
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 10

Categorias de padres GoF - Metsker

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

11

Relacionamento entre os Padres

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

12

Outros Padres
H vrios catlogos de padres em software
Muitos so especficos a uma determinada rea (padres J2EE, padres de implementao em Java, em C#, padres para concorrncia, sistemas distribudos, etc.) Os padres apresentados aqui so aplicveis em Java e outras linguagens

Dois outros padres so muito populares atualmente


Dependency Injection: um caso particular de um dos padres GRASP (Indirection) bastante popular no momento (tambm conhecido como Inverso de Controle) Aspectos: uma extenso ao paradigma orientado a objetos que ajuda a lidar com limitaes dos sistemas OO
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 13

Mecanismos de herana
Herana estrita (extenso): subclasse estende a superclasse, acrescentando novos membros (atributos e/ou mtodos). A superclasse permanece inalterada. Herana de interface (especificao): a superclasse especifica o que uma subclasse deve oferecer, mas no implementa nenhuma funcionalidade. Apenas a interface da superclasse herdada pela subclasse. Herana polimrfica: a subclasse herda a interface e uma implementao de (pelo menos alguns) mtodos da superclasse. A subclasse pode ento redefinir mtodos para especializar o comportamento em relao ao que oferecido pela superclasse, ou ter que oferecer alguma implementao para mtodos que a superclasse tenha declarado mas no implementado.
Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

14

Mecanismos de herana em Java


Uma interface define assinaturas de mtodos e constantes.
Uma interface pode estender (i.e., ou seja, herdar de) zero, uma, ou muitas interfaces. Uma interface no define quaisquer comportamento ou atributos.

Uma classe define atributos e mtodos.


Uma classe pode estender (i.e., herdar comportamento e atributos de) zero ou mais classes. Uma classe pode implementar (i.e., estar de acordo com) zero ou mais interfaces, alm de poder estender sua super classe.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 15

Mecanismos de herana em Java


Extenso simples palavra-chave extends; para herana estrita, marcar todos os mtodos da superclasse como final. Especificao uma especificao implementada como uma interface; subclasses da especificao usam a palavrachave implements para indicar este tipo de herana. separa interface e implementao implementaes podem ser transparentemente substitudas Diminui o acoplamento
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 16

Mecanismos de herana em Java


Herana polimrfica como a extenso simples, usa a palavra-chave extends. Usando na superclasse as palavras-chave final e abstract, possvel indicar que partes da superclasse no podem ser modificadas ou devem ser modificadas.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

17

Princpio de Substituio de Liskov


Liskov Substitution Principle (LSP), por Barbara Liskov, em 1993. Princpio: Todas as classes derivadas de uma classe devem ser trocveis quando usadas como a classe base Exemplo:
Seja A uma classe e B uma de suas subclasses. Seja ainda o mtodo m(A a) { } Se m se comporta corretamente quando o parmetro uma instncia de A, ele deve se comportar corretamente quando o parmetro uma instncia de B Isso sem que m precise saber que existe a classe B
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 18

LSP exemplo clssico


Seja a classe abaixo.
class Rectangle { protected double h,w; protected Point top_left; public double setHeight (double x) { h=x; } public double setWidth (double x) { w=x; } public double getHeight () { return h; } public double getWidth () { return w; } public double area() { return h*w; } }

Suponha que tenhamos vrias aplicaes clientes da classe Rectangle


Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 19

LSP exemplo clssico (cont.)


Adicionando um quadrado Um quadrado um tipo de retngulo, certo? Ento: class Square extends Rectangle { } A princpio, no precisamos modificar o cdigo cliente pr-existente.
e.g., void m(Rectangle x) { } no precisa de modificaes quando da adio dessa nova classe Square.

Mas, h problemas

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

20

10

LSP exemplo clssico (cont.)


Problema: com a soluo anterior, podemos degenerar um quadrado!, ie, podemos criar quadrados com lados diferentes !?@ Uma segunda soluo: redefinir os mtodos setHeight e setWidth na classe Square:
class Square extends Rectangle { public void setHeight(double x) { h=x; w=x; } public void setWidth(double x) { h=x; w=x; } }
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 21

LSP exemplo clssico (cont.)


Considere agora o trecho de cdigo (cliente) a seguir:
void m(Rectangle r) { r.setHeight(5); r.setWidth(4); assert (r.area() == 20); }

Quando temos apenas objetos retngulo, o cdigo acima vlido; no entanto, este cdigo no vlido quando, alm de retngulos, temos tambm quadrados. No h nada de errado com m O que est errado em Square?
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 22

11

O papel do LSP
LSP um princpio bastante restritivo. Em geral, os desenvolvedores apiam LSP e o tm como uma meta. Deve ser usado como um sinalizador
possvel e aceitvel que se viole esse princpio, mas a violao deve ser examinada cuidadosamente.

Depende do cliente da hierarquia de classes


E.g., se temos um programa no qual altura e comprimento nunca so modificados, aceitvel ter um Square como uma subclasse de Rectangle.

Square subclass of Rectangle e Eclipse subclass of Circle tm sido fontes de guerras religiosas na comunidade OO por anos (vide http://ootips.org)
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 23

Acoplamentos concreto e abstrato


Usualmente, um objeto A faz referncia a outro B atravs do conhecimento da classe de B.
Esse tipo de dependncia corresponde ao que chamamos de acoplamento concreto.

Entretanto, h outra forma de dependncia que permite que um objeto remetente envie uma mensagem para um receptor sem ter conhecimento da verdadeira classe desse ltimo.
Essa forma de dependncia corresponde ao que chamamos de acoplamento abstrato. A acoplamento abstrato prefervel ao acoplamento concreto.

Classes abstratas e interface permitem implementar o acoplamento abstrato. Abril 08


Prof(s). Ismael H. F. Santos & Eduardo Bezerra

24

12

Acoplamentos concreto e abstrato (cont)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

25

Reuso atravs de generalizao


No reuso por generalizao/especializao subclasses herdam comportamento da superclasse.
Exemplo: um objeto ContaCorrente no tem como atender mensagem para executar a operao debitar s com os recursos de sua classe. Ele, ento, utiliza a operao herdada da superclasse.

Vantagem:
Fcil de implementar.

Desvantagem:
Exposio dos detalhes da superclasse s subclasses (Violao do princpio do encapsulamento). Possvel violao do Princpio de Liskov (regra da substituio).
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 26

13

Reuso atravs de delegao


A delegao outra forma de realizar o reuso. Sempre que um objeto no pode realizar uma operao por si prprio, ele delega uma parte dela para outro(s) objeto(s).

Ou seja, o objeto reusa as operaes dos objetos para os quais ele delega responsabilidades. A delegao implica na composio de objetos.
A delegao mais genrica que a generalizao.
um objeto pode reutilizar o comportamento de outro sem que o primeiro precise ser uma subclasse do segundo.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

27

Reuso atravs de delegao


Uma outra vantagem da delegao sobre a herana de classes que o compartilhamento de comportamento e o reuso podem ser realizados em tempo de execuo.
Na herana de classes, o reuso especificado estaticamente e no pode ser modificado.

Desvantagens:
desempenho (implica em cruzar a fronteira de um objeto a outro para enviar uma mensagem). no pode ser utilizada quando uma classe parcialmente abstrata est envolvida.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

28

14

Delegao x Herana de classes


Um exemplo
Vetor +adicionar() +remover() +obter() Pilha +empilhar() +desempilhar()
1

topo := topo + 1 vetor.adicionar(topo, objeto)

return vetor.obter(topo) topo := topo - 1

adicionar(objeto, topo) topo := topo + 1

Pilha +empilhar() +desempilhar()

Vetor +adicionar() +remover() +obter()

remover(objeto) topo := topo - 1

Que princpio est sendo violado aqui?


Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 29

Generalizao versus delegao


H vantagens e desvantagens tanto na generalizao quanto na delegao. De forma geral, no recomendado utilizar generalizao nas seguintes situaes:
Para representar papis de uma superclasse. Quando a subclasse herda propriedades que no se aplicam a ela. Quando um objeto de uma subclasse pode se transformar em um objeto de outra subclasse.
Por exemplo, um objeto Cliente se transforma em um objeto Funcionrio.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 30

15

Padres para Adaptao Interfaces


Padres de design que concentram-se principalmente na adaptao de interfaces so:
Adapter: para adaptar a interface de uma classe para outra que o cliente espera Faade: oferecer uma interface simples para uma coleo de classes Composite: definir uma interface comum para objetos individuais e composies de objetos Bridge: desacoplar uma abstrao de sua implementao para que ambos possam variar independentemente

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

31

POO-Java

Padres GoF Singleton

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

32

16

Singleton
Motivao: algumas classes devem ser instanciadas uma nica vez:
Um spooler de impresso Um sistema de arquivos Um Window manager Um objeto que contm a configurao do programa Um ponto de acesso ao banco de dados

Obstculo: a definio de uma varivel global deixa a instncia (objeto) acessvel mas no inibe a instanciao mltipla. Como assegurar que somente uma instncia de uma classe seja criada para toda a aplicao?
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 33

Singleton
Inteno: garantir que uma classe tem apenas uma instncia, e prover um ponto de acesso global a ela; Soluo: fazer com que a prpria classe seja responsvel pela manuteno da instncia nica, de tal forma que:
Quando a instncia for requisitada pela primeira vez, essa instncia deve ser criada; Em requisies subseqentes, a instncia criada na primeira vez retornada. A classe Singleton deve: armazenar a nica instncia existente; garantir que apenas uma instncia ser criada; prover acesso a tal instncia.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 34

17

Singleton (estrutura)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

35

Singleton (implementao)
public final class Singleton { private static Singleton instance = null; private Singleton () { ... } public static Singleton getInstance() { if (instance == null) { instance = new Singleton (); } return instance; } ... }
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 36

18

Singleton (uso)
public class UsoDoSingleton { : Singleton obj; : obj = Singleton.getInstance(); : }

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

37

POO-Java

Padres GoF Iterator

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

38

19

Iterator
Toda coleo possui uma representao interna para o armazenamento e organizao de seus elementos.
Por outro lado, essa coleo deve permitir que seus elementos sejam acessados sem que sua estrutura interna seja exposta.

De uma maneira geral, pode-se desejar que estes elementos sejam percorridos de vrias maneira, sem no entanto ter que modificar a interface da coleo em funo do tipo de varredura desejado.
de frente para trs, vice-versa, ou mesmo em ordem aleatria.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

39

Iterator
O padro Iterator permite descrever uma forma de percorrer os elementos de uma coleo sem violar o encapsulamento dessa coleo. Inteno: iterar sobre (percorrer seqencialmente) uma coleo de objetos sem expor sua representao.
Obedecer o princpio do encapsulamento

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

40

20

Iterator
Soluo: um objeto intermedirio (iterator) usado entre o cliente e a coleo de objetos.
Este objeto conhece a estrutura interna da coleo a ser percorrida, e apresenta uma interface para percorrer tal estrutura. Esta interface independente dessa estrutura interna. Os clientes que desejam percorrer a coleo utilizam a interface do objeto intermedirio, em vez de se comunicarem diretamente com a coleo de objetos.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

41

Iterator
Requisitos de um iterador
Um modo de localizar um elemento especfico da coleo, tal como o primeiro elemento. Um modo de obter acesso ao elemento atual. Um modo de obter o prximo elemento. Um modo de indicar que no h mais elementos a percorrer.

Exemplo em Java
As classes List, Set e Sorted so subclasses de Collection, e herdam um mtodo iterator() que retorna um objeto iterador. O objeto Iterator possui mtodos hasNext() e next().
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 42

21

Iterator (exemplo)
// ICollection.java // interface para obteno de Iterator para colees public interface ICollection { // obteno de um Iterator public IIterator getIterator(); // determina existncia de um elemento public boolean has(Object object); // adio de um elemento public boolean add(Object object); // remoo de um elemento public boolean remove(Object object); // remoo de todos os elementos public void removeAll(); }
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 43

Iterator (exemplo)
// IIterator.java public interface IIterator { // verifica a existncia de um prximo elemento public boolean hasNext(); // retorna o prximo elemento public Object next(); }

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

44

22

Iterator (estrutura)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

45

Iterator (participantes)
Iterator
Define um interface para o acesso e varredura;

ConcreteIterator
Implementa a interface do Iterator;
Mantm referncia (cursor) ao objeto que est sendo percorrido, podendo calcular qual o elemento seguinte.

Aggregate
Define um interface para a criao do objeto Iterator;

ConcreteAggregate
Implementa o mtodo da interface que retorna uma instncia do ConcreteIterator.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 46

23

Iterator (aplicabilidade)
O uso do padro Iterator se aplica quando se quer:
acessar o contedo de objeto agregados sem expor sua representao interna; dar suporte a mais de uma maneira de percorrer a lista; prover interface nica para percorrer estruturas agregadas diferentes.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

47

Iterator (conseqncias)
Mantm separadas a representao interna e a responsabilidade de navegao pelas partes.
O iterador conhece a estrutura interna das partes, mas os clientes do iterador no conhecem.

Move da coleo de objetos para o objeto iterator a responsabilidade de acesso e varredura da coleo. A coleo ainda responsvel por criar seus prprios iteradores e o faz atravs do padro Factory Method. H a possibilidade de utilizar mais de um iterador simultaneamente.
D suporte a mltiplas maneiras de percorrer a coleo e, se necessrio, essas varreduras podem ocorrer ao mesmo tempo.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 48

24

POO-Java

Padres GoF FactoryMethod

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

49

Factory Method
Inteno: definir uma interface para criao de um objeto, permitindo que as suas subclasses decidam qual classe instanciar. O Factory Method deixa a responsabilidade de instanciao para as subclasses.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

50

25

Factory Method (estrutura)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

51

Factory Method (consequncias)


Prov ganchos para subclasses; Conecta hierarquia de classes paralelas quando h delegao.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

52

26

POO-Java

Padres GoF Abstract Factory

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

53

Abstract Factory
Inteno: fornecer uma interface comum para a criao de famlias de objetos relacionados ou dependentes sem especificar suas classes concretas. Soluo: crie uma interface para representar uma fbrica para cada famlia de objetos. As subclasses concretas instanciam cada famlia especfica.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

54

27

Abstract Factory (estrutura)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

55

Abstract Factory (participantes)


Fbrica Abstrata: declara uma interface para operaes criam objetos-produto abstratos; Fbrica Concreta: implementa as operaes para criar objetos-produto concretos; Produto Abstrato: declara uma interface para um tipo de objeto produto. Produto Concreto: implementa a interface abstrata de Produto Abstrato e define um objeto-produto a ser criado pela Fbrica Concreta correspondente. Cliente: utiliza apenas as interfaces declaradas por Fbrica Abstrata e Produto Abstrato.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 56

28

Abstract Factory (conseqncias)


Isola classes concretas: uma vez que uma fbrica encapsula a responsabilidade e o processo de criao de objetos-produto, ela isola clientes das classes de implementao. Fica mais fcil a troca de uma famlia de produtos, bastando trocar a fbrica concreta usada pela aplicao. Promove consistncia entre produtos. O suporte a novos tipos de produtos dificultado, j que a interface definida em AbstractFactory fixa o conjunto de produtos que podem ser criados.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

57

Abstract Factory (aplicabilidade)


Quando o sistema deve ser independente de como seus produtos so criados, compostos e representados. Quando o sistema deve ser configurado com uma dentre vrias famlias de produtos.
necessrio fornecer uma biblioteca de classes, mas no desejvel revelar que produto particular est sendo usado.

Quando uma famlia de produtos relacionados foi projetada para ser usada em conjunto, e esta restrio tem de ser garantida.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 58

29

Abstract Factory (exemplo)


Exemplo: portabilidade entre bibliotecas GUI (Gnome,KDE)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

59

POO-Java

Padres GoF Command

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

60

30

Command
Inteno: associar uma ao a diferentes objetos atravs de uma interface conhecida. Permitir que objetos deste tipos tenham tais aes executadas sem que conheamos o tipo de tais objetos ou a natureza das aes. Soluo: encapsular uma requisio como um objeto, permitindo a parametrizao de clientes com diferentes requisies.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

61

Command (estrutura)
Command Client Invoker * execute() Receiver action()

ConcreteCommand state execute()

receiver.action()

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

62

31

Command (exemplo de interao)


: Client : Invoker : Receiver

create()

: ConcreteCommand store( aCommand )

execute() action()

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

63

Command (conseqncias)
Isola requisitante do executor; Permite registro (log) e/ou retrocesso (undo) de aes; Permite execuo em instante posterior requisio
i.e., permite enfileirar aes para processamento em outro momento.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

64

32

POO-Java

Padres GoF Template Method

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

65

Template Method
Inteno: definir o esqueleto de um algoritmo em uma operao, postergando (delegando) a definio de alguns passos desse algoritmo para subclasses. Soluo:
Em uma classe X, definir a parte invarivel do algoritmo em uma operao. Essa operao denominada mtodo template (template method). Nesta mesma operao, fazer chamadas a operaes que representam a parte varivel do algoritmo. Essas operaes so denominadas operaes gancho (hook operations). Essas operaes gancho devem ento ser implementadas pelas subclasses de X.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 66

33

Template Method (estrutura)

Abril 08 Prof(s). Ismael H. F. Santos Eduardo operations primitiveOperation1 e primitiveOperation2 so&hookBezerra

67

Template Method (aplicabilidade)


Quando queremos implementar partes invariveis de um algoritmo e deixar que as subclasses implementem os comportamentos variveis; Quando comportamentos comuns entre subclasses devem ser fatorados e localizados em uma superclasse comum.
evitando assim duplicao de cdigo;

Quando queremos controlar a extenso das subclasses.


Pode-se definir um template method que chama hook operations em pontos especficos, permitindo desse modo extenses apenas nesses pontos.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 68

34

Template Method (conseqncias)


Permite que as subclasses redefinam certos passos de um algoritmo sem mudar a estrutura desse algoritmo.
i.e., Template Method usa herana para variar partes de um algoritmo.

Um operao gancho no precisa necessariamente ser abstrata. Padro importante no desenvolvimento de frameworks, pois fornece uma maneira de separar o comportamento varivel do comportamento invarivel em uma aplicao.
Permitem a implementao do Princpio de Hollywood (ou inverso de controle): no nos ligue; ns ligaremos pra voc. Inverso: uma superclasse chama operaes de sua subclasse.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 69

POO-Java

Padres GoF Adapter

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

70

35

Adapter
Inteno: adaptar um objeto preexistente para uma interface especfica com a qual um outro objeto espera se comunicar. Soluo: Definir uma classe que serve como um adaptador e que age como um intermedirio entre o objeto e seus clientes (utilizar herana ou composio). O adaptador traduz comandos do cliente para o fornecedor e os resultados do fornecedor para o cliente.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

71

Adapter (estrutura)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

72

36

Adapter (exemplo)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

73

Adapter (exemplo)
No posso usar XXCircle diretamente porque quero preservar o comportamento polimrfico em Shape.
Diferentes nomes e listas de parmetros XXCircle no deriva de Shape

Soluo: definir uma classe Circle que sirva como um adaptador para XXCircle.
Circle deriva de Shape Circle contm XXCircle Circle repassa mensagens enviadas para ele diretamente para XXCircle.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 74

37

Adapter (exemplo)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

75

Adapter (aplicabilidade)
Quando se quer usar uma classe j existente e sua interface no combina com a esperada pelo cliente; Quando se quer criar uma classe reutilizvel que coopera com classes no relacionadas ou no previstas, isto , classes que no necessariamente tenham interfaces compatveis; Quando se necessita usar vrias classes existentes, mas impraticvel adaptar atravs da transformao de suas interfaces para transform-las em subclasses de uma mesma classe.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

76

38

Adapter (conseqncias)
Adapta a classe Adaptee BaseClasse pelo comprometimento com a classe concreta Adapter.
Como resultado, a classe Adapter no funcionar quando se quiser adaptar uma classe e todas as suas subclasses;

Um nico objeto Adapter trabalha com vrias classes Adaptee


Quer dizer, a prpria classe Adaptee e todas as suas subclasses (se houver). O objeto Adapter pode adicionar funcionalidades a todas as classes Adaptee de uma s vez.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

77

POO-Java

Padres GoF Composite

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

78

39

Composite
So comuns as situaes onde temos que lidar com uma coleo de elementos estruturada hierarquicamente (em vez colees lineares). Problema: como criar objetos utilizando partes de tal forma que tanto o objeto todo quanto os objetos parte forneam a mesma interface para os seus clientes? Composies podem cumprir com este requisito e ainda permitir:
o tratamento da composio como um todo; ignorar as diferenas entre composies e elementos individuais; a adio transparente de novos tipos a hierarquia; a simplificao do cliente.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 79

Composite (estrutura)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

80

40

Composite (exemplo)
Expresses lgicas (booleanas)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

81

Composite (conseqncias)
Objetos complexos podem ser compostos de objetos mais simples recursivamente.
Permite forma assim uma hierarquia de objetos

O cliente pode tratar objetos parte e objetos todo da mesma forma.


Isso resulta na simplificao deste cliente. Os clientes normalmente no sabem (e nem devem se preocupar) se eles esto tratando um componente individual ou composto.

Facilita a adio de novos componentes: o cliente no tem que mudar com a adio de novos objetos
Sejam eles simples ou compostos
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 82

41

Composite (conseqncias)
O projeto pode ficar geral demais, o que torna mais difcil restringir os possveis componentes de um objeto composto.
Por exemplo, em uma hierarquia que contenha documentos e suas partes (sees, pargrafos, etc.), podemos compor sees com documentos, etc. o que no faz sentido

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

83

Composite (aplicabilidade)
Quando necessrio representar hierarquias do tipo todo-parte. Quando necessrio tratar todo e respectivas partes de forma indistinta.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

84

42

POO-Java

Padres GoF Observer

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

85

Observer
Existem situaes onde diversos objetos mudam seu estado de acordo com a mudana de estado de outro objeto.
e.g. as views e o model no framework MVC

Define uma relao de dependncia 1:N entre objetos, de tal forma que, quando um objeto (assunto) tem seu estado modificado, os seus objetos dependentes (observadores) so notificados.
Assunto subject Observadores (objetos dependentes) observers

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

86

43

Observer (motivao)
Exemplo clssico

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

87

Observer (estrutura)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

88

44

Observer (exemplo de interao)


aFile Attach() Attach() setState(foo) notify() anInfoView aListView

update() getState() foo

update()

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

89

Observer em Java
public class Observable extends Object { Collection<Observer> observers; public void addObserver(Observer o); public void deleteObserver(Observer o); public boolean hasChanged(); public void notifyObservers(); public void notifyObservers(Object arg); } public abstract interface Observer { public abstract void update(Observable o, Object arg); } public class Subject extends Observable{ public void setState(String filename); public string getState(); }
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 90

45

Observer (aplicabilidade)
Quando uma abstrao tem dois aspectos, um dependente do outro. Encapsulando-se esses aspectos em objetos separados far com que se possa vari-los e reus-los independentemente; Quando uma mudana em um objeto requer uma mudana em outros, e no se sabe como esses outros objetos efetivamente fazem suas mudanas; Quando um objeto deve poder notificar outros objetos sem assumir nada sobre eles. Dessa forma evita-se que os objetos envolvidos fiquem fortemente acoplados.

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

91

Observer (conseqncias)
Possibilita baixo acoplamento entre os objetos dependentes (os observadores) e o assunto. Acoplamento Abstrato Suporte para broadcast Dificuldade em saber o que foi mudado?

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

92

46

POO-Java

Padres GoF Model View Controller

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

93

POO-Java

MVC em Swing

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

94

47

Arquitetura MVC
O Swing adota uma arquitetura conhecida como Model-View-Controller (MVC)
Modelo = dados / contedo
estado de um boto, texto

Viso = aparncia
cor, tamanho

Controle = comportamento
reao a eventos
Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

95

Interao entre os objetos MVC


Model

atualiza

notifica

Controller

View

atualiza

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

96

48

Arquitetura MVC no Swing


Apresentao
Controlador Viso

Domnio
Modelo

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

97

Modelo-Delegado

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

98

49

Documentos Swing

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

99

Explorando a Arquitetura MVC


Como os dados (o modelo) no fazem parte integrante do elemento de interface que os exibe, podemos gerenci-los em separado Por exemplo, possvel exibir um mesmo conjunto de dados em mais de um elemento de interface, simultaneamente Tambm possvel fazer com que o elemento de interface use os dados originais, sem copi-los

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

100

50

Exemplo de Uso
Suponha que voc tem uma lista de nomes muito grande e deseja exib-la em uma JList Usando a forma que vimos, esses nomes seriam copiados para dentro da lista Para evitar essa replicao, podemos utilizar um modelo prprio, que permitir JList acessar diretamente a lista de nomes

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

101

Interface ListModel
Define o modelo usado pela classe JList Abrange dois aspectos:
1. 2.

o acesso aos dados o controle da modificao dos dados

Mtodos de ListModel
int getSize() Object getElementAt(int index) void addListDataListener(ListDataListener l) void removeListDataListener(ListDataListener l)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

102

51

De Volta ao Exemplo
Imagine que os nomes esto armazenados em um array de String Assumindo que a lista de nomes no modificada, podemos ignorar o listener Basta, ento, definir uma classe que implemente ListModel e utilize o array como fonte dos dados

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

103

Criando um Modelo
class ListaDeNomes implements ListModel { private String[] nomes; ListaDeNomes(String[] nomes) { this.nomes = nomes; } public int getSize() { return nomes.length; } public Object getElementAt(int index) { return nomes[index]; } public void addListDataListener(ListDataListener l) {} public void removeListDataListener(ListDataListener l) {} }

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

104

52

Usando o Modelo
JFrame f = new JFrame("Teste"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] nomes = {"a", "b", "c", "d", "e", "f"}; JList l = new JList(new ListaDeNomes(nomes)); Container cp = f.getContentPane(); cp.add(new JScrollPane(l)); f.pack(); f.setVisible(true);

Exerccios Questo 24 (again) - Exemplo com DefaultListModel !

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

105

Classe JTree
Componente que exibe uma estrutura de dados hierrquica (rvore) Segue o padro MVC: os dados a serem exibidos so obtidos de um modelo (TreeModel)
o modelo a ser utilizado fornecido no construtor do objeto JTree

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

106

53

Terminologia
Uma rvore composta de ns
um n ou uma folha ou possui ns filhos todo n, com exceo da raiz, tem exatamente um n pai toda rvore tem exatamente um n raiz

Tipicamente, o usurio pode expandir ou colapsar ns, tornando seus filhos, respectivamente, visveis ou invisveis

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

107

Exemplos

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

108

54

Interface TreeModel
Define um modelo de dados adequado para um JTree Pertence ao pacote javax.swing.tree O Swing oferece uma implementao dessa interface: a classe DefaultTreeModel
modelo de rvore que utiliza TreeNodes

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

109

Mtodos de DefaultTreeModel
DefaultTreeModel(TreeNode root) Object getRoot() int getChildCount(Object parent) Object getChild(Object parent, int index) void insertNodeInto(MutableTreeNode child, MutableTreeNode parent, int index) void removeNodeFromParent(MutableTreeNode node) void addTreeModelListener(TreeModelListener l)

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

110

55

Interface MutableTreeNode
uma subinterface de TreeNode Modela um n que pode ser modificado
adio/remoo de filhos modificao do contedo armazenado no n (user object)

O Swing oferece uma implementao dessa interface: a classe DefaultMutableTreeNode

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

111

Mtodos de DefaultMutableTreeNode
DefaultMutableTreeNode(Object userObject) DefaultMutableTreeNode(Object userObject, boolean allowsChildren) void add(MutableTreeNode child) void remove(MutableTreeNode child) Object getUserObject() void setUserObject(Object userObject) String toString() boolean isLeaf() Enumeration children()

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

112

56

Criando um JTree
DefaultMutableTreeNode mundo = new DefaultMutableTreeNode (Mundo); DefaultMutableTreeNode europa = new DefaultMutableTreeNode (Europa); DefaultMutableTreeNode americas = new DefaultMutableTreeNode (Amricas); mundo.add(europa); mundo.add(americas); JTree arvore = new JTree(new DefaultTreeModel(mundo));

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

113

Modos de Seleo
O modo de seleo de um JTree configurado (e gerenciado) por um modelo de seleo (TreeSelectionModel) Modos disponveis:
SINGLE_TREE_SELECTION CONTIGUOS_TREE_SELECTION DISCONTIGUOUS_TREE_SELECTION

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

114

57

Configurando o modo de seleo


Configurando modo de seleo
JTree arvore = new JTree(raiz); int modo = TreeSelectionModel.SINGLE_TREE_SELECTION; TreeSelectionModel tsm = arvore.getSelectionModel(); tsm.setSelectionMode(modo);

Obtendo a seleo corrente


TreePath path = getSelectionPath() if (path != null) { DefaultMutableTreeNode selNode = (DefaultMutableTreeNode)path.getLastPathComponent(); String selValue = (String)selNode.getUserObject();
}
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 115

Eventos de Seleo
Eventos de seleo so gerados sempre que a seleo de uma rvore alterada. Esses eventos podem ser tratados atravs da adio de um TreeSelectionListener. A interface TreeSelectionListener pertence ao pacote javax.swing.event e define apenas um mtodo: valueChanged
Exerccios Questo 27 Exerccios Questo 28
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 116

58

Concluses
Componentes essenciais de uma aplicao Swing:
Continers so janelas ou painis que contm componentes. Layouts especificam como arranjar componentes em um continer. Componentes: so os controles da interface grfica com o usurio. Ouvintes (listeners) so conectados a componentes e contm o cdigo que executado quando o componente usado. desse modo que uma ao do usurio sobre um componente conectada a um mtodo Java.
Abril 08 Prof(s). Ismael H. F. Santos & Eduardo Bezerra 117

Concluses
Alguns IDEs tm eles prprios facilidades de construo da interface grfica (editores de formulrios)
e.g. NetBeans - www.netbeans.org

Tambm h ferramentas especficas para a criao de GUIs em Java. Exemplos so:


XUI - http://xui.sourceforge.net/ UICompiler - http://uic.sourceforge.net/

Abril 08

Prof(s). Ismael H. F. Santos & Eduardo Bezerra

118

59