April 08
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
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
POO-Java
Abril 08
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
Abril 08
Abril 08
Abril 08
11
Abril 08
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
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
14
Abril 08
17
Mas, h problemas
Abril 08
20
10
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.
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
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.
24
12
Abril 08
25
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
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
27
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
28
14
15
Abril 08
31
POO-Java
Abril 08
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
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
37
POO-Java
Abril 08
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
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
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
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
44
22
Iterator (estrutura)
Abril 08
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
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
Abril 08
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
50
25
Abril 08
51
Abril 08
52
26
POO-Java
Abril 08
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
54
27
Abril 08
55
28
Abril 08
57
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
Abril 08
59
POO-Java
Abril 08
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
61
Command (estrutura)
Command Client Invoker * execute() Receiver action()
receiver.action()
Abril 08
62
31
create()
execute() action()
Abril 08
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
64
32
POO-Java
Abril 08
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
67
34
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
Abril 08
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
71
Adapter (estrutura)
Abril 08
72
36
Adapter (exemplo)
Abril 08
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
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
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;
Abril 08
77
POO-Java
Abril 08
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
80
40
Composite (exemplo)
Expresses lgicas (booleanas)
Abril 08
81
Composite (conseqncias)
Objetos complexos podem ser compostos de objetos mais simples recursivamente.
Permite forma assim uma hierarquia de objetos
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
83
Composite (aplicabilidade)
Quando necessrio representar hierarquias do tipo todo-parte. Quando necessrio tratar todo e respectivas partes de forma indistinta.
Abril 08
84
42
POO-Java
Abril 08
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
86
43
Observer (motivao)
Exemplo clssico
Abril 08
87
Observer (estrutura)
Abril 08
88
44
update()
Abril 08
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
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
92
46
POO-Java
Abril 08
93
POO-Java
MVC em Swing
Abril 08
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
95
atualiza
notifica
Controller
View
atualiza
Abril 08
96
48
Domnio
Modelo
Abril 08
97
Modelo-Delegado
Abril 08
98
49
Documentos Swing
Abril 08
99
Abril 08
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
101
Interface ListModel
Define o modelo usado pela classe JList Abrange dois aspectos:
1. 2.
Mtodos de ListModel
int getSize() Object getElementAt(int index) void addListDataListener(ListDataListener l) void removeListDataListener(ListDataListener l)
Abril 08
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
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
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);
Abril 08
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
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
107
Exemplos
Abril 08
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
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
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)
Abril 08
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
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
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
114
57
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
Abril 08
118
59