peter jandl jr dca/unicamp · flyweight, proxy. • padrões de comportamento (behavioral) –...
TRANSCRIPT
��� ��� ��� � � �� ��� �� � � � �� � � � � � �
� � ��� �� � � � � � � ��� �� � � � �
Peter Jandl Jr
DCA/Unicamp
2002
11/21/02 Padrões de Projeto 2
� ��� � �� � ��� ���� �� !� �� ��� � �� � �� � �� �� !�� �• "Cada padrão descreve um problema que
ocorre outra e mais outra vez no nosso ambiente, e então descreve o âmago da solução deste problema, de forma que 'você possa usar esta solução um milhão de vezes, sem fazer o mesmo duas vezes." [1]
• "Um padrão de projeto sistematicamente nomeia, motiva e explica um projeto genérico, que endereça um problema de projeto recorrente em sistemas orientados a objetos. Ele descreve o problema, a solução, quando é aplicável e quais as consequências de seu uso." [3]
11/21/02 Padrões de Projeto 3
"�# $ %�& '( )#"# $ %�& '( )#
• O simples uso da OO não garante que obtenhamos sistemas confiáveis, robustos, extensíveis e reutilizáveis.
• O foco das metodologias de desenvolvimento está na solução em si (o que e como) e não em suas justificativas (porque).
• É difícil compartilhar a experiência entre experts e novatos.
11/21/02 Padrões de Projeto 4
*,+ -+ . /10 - 243 / 5 .+ 3*,+ -+ . / 0 - 243 / 5 .+ 3 67 8 69 8
• Descrever e justificar soluções para problemas concretos e bem definidos (não são estratégias de implementação);
• Ser comprovados, isto é, devem ter sido previamente experimentados e testados;
• Tratar problema que ocorram em diferentes contextos;
11/21/02 Padrões de Projeto 5
��� �� � ��� � � � � �� ��� �� � � � � � � � �� � � �� �
• Descrever relações entre conceitos, mecanismos e estruturas existentes nos sistemas, seus pontos fortes e fracos;
• Capturar a evolução e aprimoramento das soluções;
• Ser utilizados em conjunto com outros padrões, compondo linguagens de padrões.
11/21/02 Padrões de Projeto 6
��� �� �� � ��� ��� � � � � � ��� �
• Permitem compartilhar experiências bem sucedidas na resolução de problemas recorrentes;
• Compõem um vocabulário de alto nível para discussão de questões relativas ao projeto de sistemas de software;
• Permitem que os desenvolvedores concentrem seus esforços nos aspectos inéditos do problema.
11/21/02 Padrões de Projeto 7
��� �� � �! "$# %��� �� � ! "$# %
&# � '( ) # &&# � '( )�# &+*, -
• Nome e Classificação
• Propósito
• Nome Secundário
• Motivação
• Aplicabilidade
• Estrutura
• Participantes
• Colaborações
• Consequências
• Implementação
• Exemplo
• Usos Conhecidos
• Padrões Relacionados
11/21/02 Padrões de Projeto 8
. /�0 12 3�4 5�6 387 9 1. / 0 12 3�4 5�6 387 9 1;:< =
• Padrões de Criação (Creational)– Abstract Factory, Builder, Factory Method,
Prototype, Singleton.
• Padrões de Estrutura (Structural)– Adapter, Bridge, Composite, Decorator, Facade,
Flyweight, Proxy.
• Padrões de Comportamento (Behavioral)– Chain of Responsability, Command, Interpreter,
Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor.
11/21/02 Padrões de Projeto 9
� ��� � ��� �� �� ��� � ��� �� �
• Garante que para uma classe específica só possa existir uma única instância, a qual é acessível de forma global e uniforme.
• A classe Singleton deve:– armazenar a única instância existente;
– garante que apenas uma instância será criada;
– provê acesso a tal instância.
11/21/02 Padrões de Projeto 10
��� ��� �� � ��� ��� �� �
Singleton
static instance: Singleton
return instancestatic getInstance(): Singleton
11/21/02 Padrões de Projeto 11
� ��� � ��� �� �� ��� � ��� �� �
// SingletonImpl.java
public final class SingletonImpl { private static SingletonImpl instance = null;
private SingletonImpl() { ... }
public SingletonImpl getInstance() { if (instance==null) { instance = new SingletonImpl(); } return instance; }}
11/21/02 Padrões de Projeto 12
� ��� � ��� ! �� ��� � ��� ! �
// UsoDoSingletonImpl.java
public class UsoDoSingletonImpl { : SingletonImpl obj; : obj = SingletonImpl.getInstance(); :}
11/21/02 Padrões de Projeto 13
�� �� � � � ��� �� � � � �
• Provê uma forma de percorrermos os elementos de uma coleção sem violar o seu encapsulamento.
• Toda coleção possui uma representação interna para o armazenamento e organização de seus elementos .
• O Iterator mantém separadas as responsabilidades de navegação por tais elementos.
11/21/02 Padrões de Projeto 14
�� � � � �� � � �
Collection
getIterator(): Iterator
ConcreteCollection
getIterator(): Iterator
Iterator
hasNext(): booleannext(): Object
ConcreteIterator
return new ConcreteIterator(this)
11/21/02 Padrões de Projeto 15
� �� � � �� �� � � �
/ / I I t er at or . j ava
/ / i nt er f ace par a navegação de col eções quai squerpubl i c i nt er f ace I I t er at or { / / ver i f i ca a exi st ênci a de um pr óxi mo el ement o public boolean hasNext(); / / r et or na o pr óxi mo el ement o public Object next();}
11/21/02 Padrões de Projeto 16
�� �� � � � ��� �� � � � �
/ / I Col ecao. j ava
/ / obt enção de I t er at or par a col eções
publ i c i nt er f ace I Col ecao {
/ / oper ação par a obt enção de um I t er at or
public IIterator getIterator();
}
11/21/02 Padrões de Projeto 17
�� �� � � � ��� �� � � � �
// Lista.javapublic class Lista implements IColecao { private Object conteudo[]; public Lista() { this(10); } public Lista(int t) { conteudo=new Object[]; } private int indexOf(Object objeto) { ... } public boolean has(Object objeto) { ... } public boolean add(Object objeto) { ... } public Object remove(Object objeto) { ... } public void removeAll() { ... } public IIterator getIterator() { return new ListaIterator(this); } public class ListaIterator implements IIterator{}}
11/21/02 Padrões de Projeto 18
�� � � � �� � � �
publ i c c l ass Li st aI t er at or i mpl ement s I I t er at or { pr i vat e Li st a l i s t a; / / r ef er ênci a par a Li st a pr i vat e i nt ul t i mo; / / cont r ol e de posi ção
publ i c Li st aI t er at or ( Li st a l i s t a) { t hi s. l i s t a = l i s t a; ul t i mo = - 1; }
public boolean hasNext() { ... } public Object next() { ... }
}
11/21/02 Padrões de Projeto 19
� �� � � �� �� � � �
/ / UsoDaLi st a. j avapubl i c c l ass UsoDaLi st a { : Lista lista = new Lista(); // instancia Lista : l i s t a. add( obj 1) ; / / execut a oper ações l i s t a. r emove( obj 2) ; / / necessár i as : / / at r avés do I t er at or per cor r e l i s t a IIterator it = lista.getIterator(); while(it.hasNext()) { System.out.println(it.next()); } :}
11/21/02 Padrões de Projeto 20
��� � ��� �� ��� � � � ��� � ��� �� �� � � � �
• É uma interface para instanciação de objetos que mantém isoladas as classes concretas usadas da requisição da criação destes objetos.
• Separa assim:– uma “ família” de classes dotadas da mesma
interface (“produtos”); e
– uma classe (“ fábrica” ) que possui um método especial (o factory method) que cria tais objetos.
11/21/02 Padrões de Projeto 21
��� � ��� �� � � � � ��� � ��� �� � � � �
ConcreteFactory
Product
ConcreteProduct1
createProduct(): Product
Factory
createProduct(): Product
if (cond) return new ConcreteProduct1()else return new ConcreteProduct2()
ConcreteProduct2
11/21/02 Padrões de Projeto 22
�� �� � � �� � �� � � � � �� �
• São comuns as situações onde temos que lidar com uma estrutura de elementos agrupada hierarquicamente (não como meras coleções).
• Composições podem cumprir com este requisito e ainda permitir:– o tratamento da composição como um todo;– ignorar as diferenças entre composições e
elementos individuais;– adição transparente de novos tipos a hierarquia;– simplificação do cliente.
11/21/02 Padrões de Projeto 23
��� �� � � �� ���� � � � � �� ��� !" # !$ %& '( )*
Container
operation1()operation2()addComponent(Component): voidremoveComponent(Component): voidgetComponent(int): ComponentgetComponentCount(): int
Component
operation1()operation2()getParent(): Component
children
ConcreteComponent
operation1()operation2()
Client uses
11/21/02 Padrões de Projeto 24
+ ,.- /0 1 / 0+ ,.- / 0 1 / 0
• Existem situações onde diversos objetos (p.e. visualizações) devem representar um outro objeto (p.e. dados).
• Define uma relação de dependência 1:N de forma que quando um certo objeto (assunto) tem seu estado modificado os demais (observadores) são notificados.
• Possibilita baixo acoplamento entre os objetos observadores e o assunto.
11/21/02 Padrões de Projeto 25
� ��� �� � � �� ��� � � � � �
Observer
update(): void
ConcreteObserver
observerState: State
update(): void
Subject
atach(Observer): voiddetach(Observer): voidnotify(): void
ConcreteSubject
subjectState: State
get State(): StatesetState(State): void
observers
subject
return subjectState
for all obs in observers obs.update() observerState = subject.getState ()
11/21/02 Padrões de Projeto 26
�� � � �� � �
• Associa uma ação a diferentes objetos através de uma interface conhecida.
• Permite que objetos deste tipos tenham tais ações executadas sem que conheçamos o tipo de tais objetos ou a natureza das ações.
• Possibilita:– isolar requisitante do executor;– registro (log) e/ou retrocesso (undo) de ações; e– execução em instante posterior a requisição
(permite enfileirar ações para processamento em outro momento).
11/21/02 Padrões de Projeto 27
�� � �� � ��� � �� � �
Client
Invoker Command
execute(): void
Receiver
action(): voidConcreteCommand
state
execute(): void
receiver.action()
receiver
11/21/02 Padrões de Projeto 28
��� �� � ��� � ��� ��� � � � ��� � ��� �
! �"#��$ % � & � � �� �! �"#��$ % � & � � �� �
[1] ALEXANDER, C., ISHIKAWA, S., SILVERSTEIN, M., JACOBSON, M., FIKSDAHL-KING, I., ANGEL, S. "A Pattern Language". New York, NY (USA): Oxford University Press, 1977.
[2] COPLIEN, J. O. "Software Patterns". New York, NY (USA): SIGS Books, 1996.
[3] GAMMA, E., HELM, R., JOHNSON, R., VLISSIDES, J. "Design Patterns: Elements of Reusable Object-Oriented Software". Reading, MA: Addison Wesley, 1995.
[4] GEARY, D. ”A look at the Composite pattern". IN JavaWorld, setembro, 2002. [ '( ()* + +, ,,.- /01 0 , 23 45- 6 27 + /01 0 , 23 4 5 + /,8 9 :8 ; 9 9 ; + /, 8 9 :< =8 5>? @AB ) 0 ( (> 3B?DC ) - '( 7 4 ].