Escolar Documentos
Profissional Documentos
Cultura Documentos
5 de janeiro de 2012
Sumrio
Sobre a K19
Seguro Treinamento
Termo de Uso
Cursos
Introduo
1.1 Sistemas Corporativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Orientao a Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Padres de Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
5
5
5
Padres de criao
2.1 Factory Method . . . . . . . . . . .
2.2 Exerccios de Fixao . . . . . . . .
2.3 Abstract Factory . . . . . . . . . . .
2.4 Abstract Factory + Factory Method
2.5 Exerccios de Fixao . . . . . . . .
2.6 Exerccios Complementares . . . .
2.7 Builder . . . . . . . . . . . . . . . .
2.8 Exerccios de Fixao . . . . . . . .
2.9 Prototype . . . . . . . . . . . . . . .
2.10 Exerccios de Fixao . . . . . . . .
2.11 Singleton . . . . . . . . . . . . . . .
2.12 Exerccios de Fixao . . . . . . . .
2.13 Multiton (no GoF) . . . . . . . . .
2.14 Exerccios de Fixao . . . . . . . .
2.15 Object Pool (no GoF) . . . . . . . .
2.16 Exerccios de Fixao . . . . . . . .
Padres Estruturais
www.k19.com.br
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
11
13
16
17
19
19
23
26
28
30
31
32
33
35
38
41
i
S UMRIO
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
4
ii
ii
Adapter . . . . . . . . . . .
Exerccios de Fixao . . .
Bridge . . . . . . . . . . . .
Exerccios de Fixao . . .
Composite . . . . . . . . .
Exerccios de Fixao . . .
Decorator . . . . . . . . . .
Exerccios de Fixao . . .
Facade . . . . . . . . . . . .
Exerccios de Fixao . . .
Front Controller (no GoF)
Exerccios de Fixao . . .
Flyweight . . . . . . . . . .
Exerccios de Fixao . . .
Proxy . . . . . . . . . . . . .
Exerccios de Fixao . . .
Padres Comportamentais
4.1 Command . . . . . . .
4.2 Exerccios de Fixao .
4.3 Iterator . . . . . . . . .
4.4 Exerccios de Fixao .
4.5 Mediator . . . . . . . .
4.6 Exerccios de Fixao .
4.7 Observer . . . . . . . .
4.8 Exerccios de Fixao .
4.9 State . . . . . . . . . . .
4.10 Exerccios de Fixao .
4.11 Strategy . . . . . . . . .
4.12 Exerccios de Fixao .
4.13 Template Method . . .
4.14 Exerccios de Fixao .
4.15 Visitor . . . . . . . . . .
4.16 Exerccios de Fixao .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
www.k19.com.br
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
41
44
46
49
51
55
57
61
63
66
68
69
70
73
75
78
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
81
81
84
86
89
90
93
96
99
101
103
105
108
109
112
113
117
S UMRIO
Sobre a K19
A K19 uma empresa especializada na capacitao de desenvolvedores de software. Sua equipe
composta por profissionais formados em Cincia da Computao pela Universidade de So Paulo
(USP) e que possuem vasta experincia em treinamento de profissionais para rea de TI.
O principal objetivo da K19 oferecer treinamentos de mxima qualidade que relacionados s
principais tecnologias utilizadas pelas empresas. Atravs desses treinamentos, seus alunos se tornam
capacitados para atuar no mercado de trabalho.
Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melhoria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizados
didtica e tecnicamente.
www.k19.com.br
S UMRIO
Seguro Treinamento
Na K19 o aluno faz o curso quantas vezes quiser!
Comprometida com o aprendizado e com a satisfao dos seus alunos, a K19 a nica que possui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejar
mediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento.
As vagas no preenchidas at um dia antes do incio de uma turma da K19 sero destinadas ao
alunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treinamento 10% do valor total do curso.
www.k19.com.br
S UMRIO
Termo de Uso
Termo de Uso
Todo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizada
livremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como material
de apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida pelo
MEC (Ministrio da Educao) e que a K19 seja citada explicitamente como proprietria do material.
proibida qualquer utilizao desse material que no se enquadre nas condies acima sem
o prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito s
medidas legais cabveis.
www.k19.com.br
S UMRIO
S
TO
EN
AM
EIN
TREINAMENTOS
TR
EIN
AM
EN
TO
S
TR
www.k19.com.br/cursos
www.k19.com.br
CAPTULO
I NTRODUO
Sistemas Corporativos
Dificilmente, uma empresa consegue sobreviver sem auxlio de ferramentas computacionais. Algumas organizaes necessitam de ferramentas bsicas como editores de texto, planilhas ou geradores de apresentao enquanto outras necessitam de ferramentas especficas (sistemas corporativos)
que contemplem todos os processos administrativos da organizao.
Em geral, a complexidade no desenvolvimento e na manuteno de um sistema corporativo
alta. Essa complexidade aumenta o custo e o tempo para desenvolv-lo e mant-lo.
Tcnicas de programao como orientao a objetos, metodologias de gerenciamento como
scrum e ferramentas como Java podem diminuir o tempo e o dinheiro gastos na rea de TI.
Orientao a Objetos
O paradigma de programao orientado a objetos estabelece princpios fundamentais referentes organizao de um software. Esses princpios podem diminuir consideravelmente o custo no
desenvolvimento e na manuteno de sistemas corporativos.
Abaixo, algumas caractersticas dos sistemas orientados a objetos:
Modularidade
Encapsulamento
Polimorfismo
Hoje em dia, a orientao a objetos o modelo de programao mais utilizado na modelagem de
sistemas corporativos.
Padres de Projeto
Apesar de especficos, os sistemas corporativos possuem diversas caractersticas semelhantes.
Consequentemente, muitos problemas se repetem em contextos distintos.
Suponha que um determinado problema ocorrer em duzentos sistemas diferentes. Em cada
sistema, esse problema pode ser resolvido de uma forma distinta. Ento, globalmente, teramos
duzentas solues para o mesmo problema. Provavelmente, algumas solues seriam melhores que
outras ou at mesmo uma delas melhor do que todas as outras.
www.k19.com.br
I NTRODUO
Para no perder tempo e dinheiro elaborando solues diferentes para o mesmo problema, poderamos escolher uma soluo como padro e adot-la toda vez que o problema correspondente
ocorrer. Alm de evitar o retrabalho, facilitaramos a comunicao dos desenvolvedores e o entendimento tcnico do sistema.
Da surge o conceito de padro de projeto ou design pattern. Um padro de projeto uma
soluo consolidada para um problema recorrente no desenvolvimento e manuteno de software
orientado a objetos.
A referncia mais importante relacionada a padres de projeto o livro Design Patterns: Elements
of Reusable Object-Oriented Software (editora Addison-Wesley, 1995) dos autores Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides. Esses quatro autores so conhecidos como Gang of
Four(GoF). Os diagramas UML apresentados nesta apostila so baseados nos diagramas desse livro.
Padres GoF
Os padres definidos no livro Design Patterns: Elements of Reusable Object-Oriented Software so
denominados padres GoF. Eles so classificados em trs categorias: padres de criao, estruturais
e comportamentais.
www.k19.com.br
CAPTULO
PADRES DE CRIAO
Em um sistema orientado a objetos, a criao de certos objetos pode ser uma tarefa extremamente complexa. Podemos destacar dois problemas relacionados a criao de objetos:
definir qual classe concreta deve ser utilizada para criar o objeto;
definir como os objetos devem ser criados e como eles se relacionam com outros objetos do
sistema.
Seguindo o princpio do encapsulamento, essa complexidade deve ser isolada. A seguir, mostraremos padres de projetos que podem ser adotados para encapsular a criao de objetos em diversas
situaes distintas.
Veja abaixo um resumo do objetivo de cada padro de criao.
Factory Method Encapsular a escolha da classe concreta a ser utilizada na criao de objetos de um
determinado tipo.
Abstract Factory Encapsular a escolha das classes concretas a serem utilizadas na criao dos objetos de diversas famlias.
Builder Separar o processo de construo de um objeto de sua representao e permitir a sua criao passo-a-passo. Diferentes tipos de objetos podem ser criados com implementaes distintas de cada passo.
Prototype Possibilitar a criao de novos objetos a partir da cpia de objetos existentes.
Singleton Permitir a criao de uma nica instncia de uma classe e fornecer um modo para recuperla.
Multiton Permitir a criao de uma quantidade limitada de instncias de determinada classe e fornecer um modo para recuper-las.
Object Pool Possibilitar o reaproveitamento de objetos.
Factory Method
Objetivo: Encapsular a escolha da classe concreta a ser utilizada na criao de objetos de um determinado tipo.
www.k19.com.br
PADRES DE CRIAO
Exemplo prtico
Considere um sistema bancrio que precisa enviar mensagens aos seus clientes. Por exemplo,
aps a realizao de uma compra com carto de crdito, uma mensagem contendo informaes
sobre a compra pode ser enviada ao cliente.
Se esse cliente for uma pessoa fsica, poder optar pelo recebimento da mensagem atravs de
email ou SMS. Por outro lado, se for uma pessoa jurdica, poder tambm receber a mensagem atravs de JMS (Java Message Service).
K19 Kard
K19
Data:
10/12/2011
Valor:
R$ 300,00
DEBIT
Transao
Aprovada
Cada mecanismo de envio ser implementado por uma classe. Podemos criar uma interface para
padronizar essas classes e obter polimorfismo entre seus objetos.
1
2
3
1
2
3
4
5
6
1
2
3
4
5
6
www.k19.com.br
9
1
2
3
4
5
6
PADRES DE CRIAO
public class EmissorJMS implements Emissor {
public void envia ( String mensagem ) {
System . out . println ( " Enviando por JMS a mensagem : " ) ;
System . out . println ( mensagem ) ;
}
}
Cdigo Java 2.4: EmissorJMS.java
Quando for necessrio enviar um mensagem, podemos utilizar diretamente esses emissores.
1
2
1
2
1
2
Utilizando essa abordagem, o cdigo que deseja enviar uma mensagem referencia diretamente
as classes que implementam os mecanismos de envio. Para eliminar essa referncia direta, podemos
adicionar um intermedirio entre o cdigo que deseja enviar uma mensagem e as classes que implementam os emissores. Esse intermedirio ser o responsvel pela escolha da classe concreta a ser
utilizada para criar o tipo de emissor adequado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Especializao
Talvez, o sistema tenha que trabalhar com dois tipos diferentes de envio de mensagens: sncrono
e assncrono. Podemos especializar o criador de emissores, definindo subclasses.
www.k19.com.br
PADRES DE CRIAO
1
2
3
4
5
6
7
8
9
10
11
12
13
10
1
2
3
4
5
6
7
8
9
10
11
12
13
Agora, para enviar uma mensagem, podemos acionar o criador adequado (EmissorCreator,
EmissorAssincronoCreator ou EmissorSincronoCreator) para obter o emissor desejado.
1
2
3
1
2
3
1
2
3
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
10
www.k19.com.br
11
PADRES DE CRIAO
Client
<<usa>>
<<usa>>
Creator
Product
factoryMethod()
ConcreteProduct
ConcreteCreator
<<cria>>
factoryMethod()
Exerccios de Fixao
1
1
2
3
1
2
3
4
5
6
www.k19.com.br
11
PADRES DE CRIAO
12
1
2
3
4
5
6
1
2
3
4
5
6
1
2
3
4
5
6
7
8
9
10
11
12
5
Para tornar a classe TestaEmissores menos dependente das classes que implementam os mecanismos de envio, podemos definir uma classe intermediria que ser responsvel pela criao dos
emissores.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PADRES DE CRIAO
public class TestaEmissores {
public static void main ( String [] args ) {
EmissorCreator creator = new EmissorCreator () ;
// SMS
Emissor emissor1 = creator . create ( EmissorCreator . SMS ) ;
emissor1 . envia ( " K19 Treinamentos " ) ;
// Email
Emissor emissor2 = creator . create ( EmissorCreator . EMAIL ) ;
emissor2 . envia ( " K19 Treinamentos " ) ;
// JMS
Emissor emissor3 = creator . create ( EmissorCreator . JMS ) ;
emissor3 . envia ( " K19 Treinamentos " ) ;
}
}
Abstract Factory
Objetivo: Encapsular a escolha das classes concretas a serem utilizadas na criao dos objetos de
diversas famlias.
Exemplo prtico
13
PADRES DE CRIAO
14
VISA | MASTERCARD
VISA | MASTERCARD
K19 Kard
K19 Kard
Valor: R$ 300,00
Senha:
DEBIT
DEBIT
TRANSAO
AUTORIZADA
14
www.k19.com.br
15
1
2
3
4
5
6
7
8
9
PADRES DE CRIAO
public class VisaComunicadorFactory implements ComunicadorFactory {
public Emissor createEmissor () {
// criando um emissor Visa
}
public Receptor createReceptor () {
// criando um receptor Visa
}
}
Cdigo Java 2.22: VisaComunicadorFactory.java
1
2
3
4
5
6
7
8
9
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
www.k19.com.br
15
PADRES DE CRIAO
16
AbstractFactory
<<usa>>
createProductA()
createProductB()
Client
ConcreteProductA2
ConcreteProductA1
ConcreteFactory1
createProductA()
createProductB()
<<usa>>
AbstractProductA
ConcreteFactory2
createProductA()
createProductB()
<<cria>>
<<usa>>
AbstractProductB
ConcreteProductB1
ConcreteProductB2
<<cria>>
AbstractFactory (ComunicadorFactory)
Interface que define as assinaturas dos mtodos responsveis pela criao dos objetos uma
famlia.
ConcreteFactory (VisaComunicadorFactory, MastercardComunicadorFactory)
Classe que implementa os mtodos de criao dos objetos de uma famlia.
AbstractProduct (Emissor, Receptor)
Interface que define um tipo de produto.
ConcreteProduct (EmissorVisa, ReceptorVisa, EmissorMastercard, ReceptorMastercard)
Implementao particular de um tipo de produto.
Client (Aplicao)
Usa apenas as interfaces AbstractFactory e AbstractProduct.
16
www.k19.com.br
17
12
PADRES DE CRIAO
}
Cdigo Java 2.26: VisaComunicadorFactory.java
1
2
3
4
5
6
7
8
9
10
11
12
Exerccios de Fixao
7
1
2
3
1
2
3
1
2
3
4
5
6
7
1
2
3
4
5
6
7
www.k19.com.br
17
PADRES DE CRIAO
1
2
3
4
5
6
18
1
2
3
4
5
6
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
11
1
2
3
4
18
www.k19.com.br
19
12
1
2
3
4
5
6
7
8
9
10
11
12
PADRES DE CRIAO
13
1
2
3
4
5
6
7
8
9
10
11
12
14
1
2
3
4
5
6
7
8
9
10
11
12
13
Exerccios Complementares
1
Builder
www.k19.com.br
19
PADRES DE CRIAO
20
Exemplo prtico
Estamos desenvolvendo um sistema para gerar boletos bancrios. No Brasil, a FEBRABAN (Federao Brasileira de Bancos) define regras gerais para os boletos. Contudo, cada instituio bancria
define tambm as suas prprias regras especficas para o formato dos dados dos boletos.
Segundo a FEBRABAN, os elementos principais relacionados a um boleto so:
Banco: Instituio que receber o pagamento do sacado e creditar o valor na conta do cedente.
Nosso Nmero: Cdigo de identificao do boleto utilizado pela instituio bancria e pelo cedente
para controle dos pagamentos.
20
www.k19.com.br
21
PADRES DE CRIAO
Cedente
Nosso Nmero
Valor
Sacado
Vencimento
Cedente
Nosso Nmero
K19 Treinamentos
Valor
Sacado
Vencimento
Rafael Cosentino
Cedente
Nosso Nmero
K19 Treinamentos
1234567890
Valor
R$ 300,00
Sacado
Vencimento
Rafael Cosentino
K19 Bank
12/12/2012
|252-0| 857-09543-234-12464278-27857-5487362-34613-35
Cedente
Nosso Nmero
K19 Treinamentos
1234567890
Valor
Sacado
Rafael Cosentino
Vencimento
R$ 300,00
12/12/2012
Para gerar um boleto, devemos definir todas essas informaes. Para encapsular a complexidade
desse processo, poderamos definir classes responsveis pela criao dos boletos de acordo com a
instituio bancria. Inclusive, poderamos padronizar essas classes atravs de uma interface.
1
2
3
4
5
6
public
void
void
void
void
void
inteface BoletoBuilder {
buildSacado ( String sacado ) ;
buildCedente ( String cedente ) ;
buildValor ( double valor ) ;
buildVencimento ( Calendar vencimento ) ;
buildNossoNumero ( int nossoNumero ) ;
www.k19.com.br
21
PADRES DE CRIAO
7
8
9
10
11
22
void buildCodigoDeBarras () ;
void buildLogotipo () ;
Boleto getBoleto () ;
}
Cdigo Java 2.40: BoletoBuilder.java
1
2
3
1
2
3
1
2
3
Agora, poderamos obter de alguma fonte externa (usurio, banco de dados, arquivos e etc) as
informaes necessrias e gerar um boleto utilizando o montador adequado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Quando for necessrio gerar um boleto, devemos escolher uma implementao da interface
BoletoBuilder.
22
www.k19.com.br
23
1
2
3
PADRES DE CRIAO
BoletoBuilder boletoBuilder = new BBBoletoBuilder () ;
GeradorDeBoleto geradorDeBoleto = new GeradorDeBoleto ( boletoBuilder ) ;
Boleto boleto = geradorDeBoleto . geraBoleto () ;
Cdigo Java 2.45: Gerando um boleto
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
<<interface>>
Builder
Director
construct()
buildPartA()
buildPartB()
Product
<<usa>>
Client
ConcreteBuilder1
ConcreteBuilder2
<<cria>>
buildPartA()
buildPartB()
buildPartA()
buildPartB()
Product2
Product1
<<cria>>
Product (Boleto)
Define os objetos que devem ser construdos pelos Builders.
Builder (BoletoBuilder)
Interface que define os passos para a criao de um produto.
ConcreteBuilder (BBBoletoBuilder, ItauBoletoBuilder, BradescoBoletoBuilder)
Constri um produto especfico implementando a interface Builder.
Director (GeradorDeBoleto)
Aciona os mtodo de um Builder para construir um produto.
Exerccios de Fixao
15
16
1
2
3
4
5
www.k19.com.br
23
PADRES DE CRIAO
6
7
8
24
int getNossoNumero () ;
String toString () ;
}
Cdigo Java 2.46: Boleto.java
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
24
public BBBoleto ( String sacado , String cedente , double valor , Calendar vencimento , int nossoNumero ) {
this . sacado = sacado ;
this . cedente = cedente ;
this . valor = valor ;
this . vencimento = vencimento ;
this . nossoNumero = nossoNumero ;
}
public String getSacado () {
return this . sacado ;
}
public String getCedente () {
return this . cedente ;
}
public double getValor () {
return this . valor ;
}
public Calendar getVencimento () {
return this . vencimento ;
}
public int getNossoNumero () {
return this . nossoNumero ;
}
public String toString () {
StringBuilder stringBuilder = new StringBuilder () ;
stringBuilder . append ( " Boleto BB " ) ;
stringBuilder . append ( " \ n " ) ;
stringBuilder . append ( " Sacado : " + this . sacado ) ;
stringBuilder . append ( " \ n " ) ;
stringBuilder . append ( " Cedente : " + this . cedente ) ;
stringBuilder . append ( " \ n " ) ;
stringBuilder . append ( " Valor : " + this . valor ) ;
stringBuilder . append ( " \ n " ) ;
stringBuilder . append ( " Vencimento : " + this . sacado ) ;
stringBuilder . append ( " \ n " ) ;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( " dd / MM / yyyy " ) ;
String format = simpleDateFormat . format ( this . vencimento . getTime () ) ;
stringBuilder . append ( " Vencimento : " + format ) ;
stringBuilder . append ( " \ n " ) ;
stringBuilder . append ( " Nosso Nmero : " + this . nossoNumero ) ;
stringBuilder . append ( " \ n " ) ;
www.k19.com.br
25
60
61
62
63
PADRES DE CRIAO
18
Defina uma interface que ir padronizar as classes responsveis pela criao dos boletos.
1
2
3
4
5
6
7
8
9
public
void
void
void
void
void
interface BoletoBuilder {
buildSacado ( String sacado ) ;
buildCedente ( String cedente ) ;
buildValor ( double valor ) ;
buildVencimento ( Calendar vencimento ) ;
buildNossoNumero ( int nossoNumero ) ;
Boleto getBoleto () ;
}
Cdigo Java 2.48: BoletoBuilder.java
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
20
1
2
3
4
5
6
www.k19.com.br
25
PADRES DE CRIAO
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
26
21
1
2
3
4
5
6
7
8
Prototype
Objetivo: Possibilitar a criao de novos objetos a partir da cpia de objetos existentes.
Exemplo prtico
Estamos desenvolvendo um sistema de anncios semelhante ao do Google Adwords. Nesse sistema, os usurios podero criar campanhas e configur-las de acordo com as suas necessidades.
Uma campanha composta por diversas informaes, entre elas:
Uma lista de anncios.
O valor dirio mximo que deve ser gasto pela campanha.
O valor mximo por exibio de anncio.
As datas de incio e trmino.
Nesse tipo de sistema, os usurios geralmente criam campanhas com configuraes extremamente parecidas. Dessa forma, seria interessante que o sistema tivesse a capacidade de criar uma
campanha a partir de uma outra campanha j criada anteriormente, para que as configuraes pudessem ser aproveitadas.
26
www.k19.com.br
27
PADRES DE CRIAO
Campanha Anual
Campanha de Vero
www.k19.com.br
www.k19.com.br
Vrios objetos do nosso sistema poderiam ter essa capacidade. Seria interessante definir uma
interface para padronizar e marcar os objetos com essas caractersticas.
1
2
3
Depois, devemos implementar a interface Prototype nas classes que devem possuir a caracterstica que desejamos.
1
2
3
4
5
6
7
Quando o usurio quiser criar uma campanha com as mesmas configuraes de uma campanha
j criada, devemos escrever um cdigo semelhante a este:
1
2
3
4
5
www.k19.com.br
27
PADRES DE CRIAO
28
Organizao
Prototype
<<usa>>
clone()
ConcretePrototype1
ConcretePrototype2
clone()
clone()
Client
Prototype
Abstrao dos objetos que possuem a capacidade de se auto copiar.
ConcretePrototype (Campanha)
Classe que define um tipo particular de objeto que pode ser clonado.
Client
Classe que cria novos objetos a partir da interface definida por Prototype.
Exerccios de Fixao
22
23
1
2
3
24
1
2
3
4
5
6
7
8
9
10
11
12
13
28
www.k19.com.br
29
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
PADRES DE CRIAO
}
public Calendar getVencimento () {
return vencimento ;
}
public Set < String > getPalavrasChave () {
return palavrasChave ;
}
public Campanha clone () {
String nome = " Cpia da Campanha : " + this . nome ;
Calendar vencimento = ( Calendar ) this . vencimento . clone () ;
Set < String > palavrasChave = new HashSet < String >( this . palavrasChave ) ;
Campanha campanha = new Campanha ( nome , vencimento , palavrasChave ) ;
return campanha ;
}
public String toString () {
StringBuffer buffer = new StringBuffer () ;
buffer . append ( " ---------------" ) ;
buffer . append ( " \ n " ) ;
buffer . append ( " Nome da Campanha : " ) ;
buffer . append ( this . nome ) ;
buffer . append ( " \ n " ) ;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( " dd / MM / yyyy " ) ;
String format = simpleDateFormat . format ( this . vencimento . getTime () ) ;
buffer . append ( " Vencimento : " + format ) ;
buffer . append ( " \ n " ) ;
buffer . append ( " Palavras - chave : \ n " ) ;
for ( String palavraChave : this . palavrasChave ) {
buffer . append ( " - " + palavraChave ) ;
buffer . append ( " \ n " ) ;
}
buffer . append ( " ---------------" ) ;
buffer . append ( " \ n " ) ;
return buffer . toString () ;
}
}
Cdigo Java 2.57: Campanha.java
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
www.k19.com.br
29
PADRES DE CRIAO
30
Singleton
Objetivo: Permitir a criao de uma nica instncia de uma classe e fornecer um modo para
recuper-la.
Exemplo prtico
Suponha que estamos desenvolvendo um sistema que possui configuraes globais obtidas a
partir de um arquivo de propriedades. Essas configuraes podem ser armazenadas em um objeto.
1
2
3
4
5
6
7
8
9
10
11
No desejamos que existam mais do que um objeto dessa classe ao mesmo tempo no sistema.
Para garantir essa restrio, podemos tornar o construtor da classe Configuracao privado e implementar um mtodo esttico que controle a criao do nico objeto que deve existir.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
De qualquer ponto do cdigo do nosso sistema, podemos acessar o objeto que contm as configuraes da aplicao.
30
www.k19.com.br
31
1
PADRES DE CRIAO
String timeZone = Configuracao . getInstance () . getPropriedade ( " time - zone " ) ;
Cdigo Java 2.61: acessando as propriedades
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Client
Singleton
<<usa>>
static getInstance()
Figura 2.9: UML do padro Singleton
Singleton (Configuracao)
Classe que permite a criao de uma nica instncia e fornece um mtodo esttico para recuperla.
Exerccios de Fixao
26
27
Crie a classe Configurao e impea que mais de um objeto exista ao mesmo tempo no sistema.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
28
31
PADRES DE CRIAO
1
2
3
4
5
6
7
32
Exemplo prtico
Estamos desenvolvendo uma aplicao que possuir diversos temas para interface do usurio. O
nmero de temas limitado e cada usurio poder escolher o de sua preferncia. Podemos implementar os temas atravs de uma classe.
1
2
3
4
5
6
7
Agora, devemos criar os temas que sero disponibilizados para a escolha dos usurios.
1
2
3
4
5
6
7
8
9
32
www.k19.com.br
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
PADRES DE CRIAO
private String nome ;
private Color corDoFundo ;
private Color corDaFonte ;
private static Map < String , Tema > temas = new HashMap < String , Tema >() ;
public static final String SKY = " Sky " ;
public static final String FIRE = " Fire " ;
static {
Tema tema1 = new Tema () ;
tema1 . setNome ( Tema . SKY ) ;
tema1 . setCorDoFundo ( Color . BLUE ) ;
tema1 . setCorDaFonte ( Color . BLACK ) ;
Tema tema2 = new Tema () ;
tema2 . setNome ( Tema . FIRE ) ;
tema2 . setCorDoFundo ( Color . RED ) ;
tema2 . setCorDaFonte ( Color . WHITE ) ;
temas . put ( tema1 . getNome () , tema1 ) ;
temas . put ( tema2 . getNome () , tema2 ) ;
}
private Tema () {
}
public static Tema getInstance ( String nomeDoTema ) {
return Tema . temas . get ( nomeDoTema ) ;
}
// GETTERS AND SETTERS
}
Cdigo Java 2.66: Tema.java
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Client
<<usa>>
Multiton
static getInstance(id)
Multiton (Tema)
Classe que permite a criao de uma quantidade limitada de instncias e fornece um mtodo
esttico para recuper-las.
Exerccios de Fixao
www.k19.com.br
33
PADRES DE CRIAO
34
29
30
Crie a classe Tema e pr defina os temas Fire e Sky utilizando o padro Multiton.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
31
34
www.k19.com.br
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PADRES DE CRIAO
public class TestaTema {
public static void main ( String [] args ) {
Tema temaFire = Tema . getInstance ( Tema . FIRE ) ;
System . out . println ( " Tema " + temaFire . getNome () ) ;
System . out . println ( " Cor Da Fonte : " + temaFire . getCorDaFonte () ) ;
System . out . println ( " Cor Do Fundo : " + temaFire . getCorDoFundo () ) ;
Tema temaFire2 = Tema . getInstance ( Tema . FIRE ) ;
System . out . println ( " --------" ) ;
System . out . println ( " Comparando as referncias ... " ) ;
System . out . println ( temaFire == temaFire2 ) ;
}
}
35
PADRES DE CRIAO
36
RECEPO
RECEPO
RECEPO
Essa uma situao tpica em que recursos limitados devem ser reutilizados. O restaurante no
adquire novas mesas a medida que clientes chegam ao restaurante e as mesas so reutilizadas por
novos clientes assim que so liberadas.
Exemplo prtico
Estamos desenvolvendo um sistema para uma empresa com uma quantidade muito grande de
projetos. Esse sistema deve controlar os recursos utilizados nos projetos. De maneira genrica, um
recurso pode ser um funcionrio, uma sala, um computador, um carro, etc.
Podemos implementar classes especializadas no controle de cada tipo de recurso utilizado nos
projetos. Alm disso, seria interessante padronizar essas classes atravs de uma interface.
36
www.k19.com.br
37
1
2
3
4
PADRES DE CRIAO
public interface Pool <T > {
T acquire () ;
void release ( T t ) ;
}
Cdigo Java 2.69: Pool.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Agora, quando um projeto necessita de um recurso como funcionrios ou salas basta utilizar os
pools.
1
2
3
4
5
6
7
8
9
10
11
12
13
www.k19.com.br
37
PADRES DE CRIAO
38
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Pool
<<usa>>
Client
acquire()
release()
ConcretePool2
ConcretePool1
acquire()
release()
acquire()
release()
Product1
Product2
Exerccios de Fixao
32
33
1
2
3
4
5
6
7
8
9
10
11
38
www.k19.com.br
39
PADRES DE CRIAO
34
1
2
3
4
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
36
1
2
3
4
5
6
7
8
9
10
www.k19.com.br
39
PADRES DE CRIAO
40
40
www.k19.com.br
CAPTULO
PADRES E STRUTURAIS
As interaes entre os objetos de um sistema podem gerar fortes dependncias entre esses elementos. Essas dependncias aumentam a complexidade das eventuais alteraes no funcionamento
do sistema. Consequentemente, o custo de manuteno aumenta. Mostraremos alguns padres de
projeto que diminuem o acoplamento entre os objetos de um sistema orientado a objetos.
Veja abaixo um resumo do objetivo de cada padro estrutural.
Adapter Permitir que um objeto seja substitudo por outro que, apesar de realizar a mesma tarefa,
possui uma interface diferente.
Bridge Separar uma abstrao de sua representao, de forma que ambos possam variar e produzir
tipos de objetos diferentes.
Composite Agrupar objetos que fazem parte de uma relao parte-todo de forma a trat-los sem
distino.
Decorator Adicionar funcionalidade a um objeto dinamicamente.
Facade Prover uma interface simplificada para a utilizao de vrias interfaces de um subsistema.
Front Controller Centralizar todas as requisies a uma aplicao Web.
Flyweight Compartilhar, de forma eficiente, objetos que so usados em grande quantidade.
Proxy Controlar as chamadas a um objeto atravs de outro objeto de mesma interface.
Adapter
Objetivo: Permitir que um objeto seja substitudo por outro que, apesar de realizar a mesma tarefa,
possui uma interface diferente.
No Brasil, mais de dez tipos de tomadas e plugues eram comercializados. Em 2007, um novo
padro para os plugues e tomadas foi definido pela ABNT. Em 2011, tornou-se permitida somente a
venda de produtos que seguiam o novo padro de dois ou trs pinos redondos.
No entanto, muitos consumidores ainda no esto preparados para o novo padro e possuem
tomadas incompatveis principalmente com os plugues de trs pinos.
Por outro lado, h tambm os casos em que a tomada segue o novo padro mas o plugue do
aparelho no o segue. Esse pode ser o caso de aparelhos adquiridos antes da nova lei entrar em vigor
ou adquiridos fora do Brasil.
www.k19.com.br
41
PADRES E STRUTURAIS
42
Exemplo prtico
Estamos realizando manuteno no sistema de gerenciamento de uma determinada empresa. O
controle de ponto desse sistema possui diversas limitaes. Essas limitaes causam muitos prejuzos. Principalmente, prejuzos financeiros.
Uma empresa parceira implementou uma biblioteca Java para controlar a entrada e sada dos
funcionrios. Essa biblioteca no possui as limitaes que existem hoje no sistema que estamos
realizando manuteno. Os diretores decidiram que a melhor estratgia seria adquirir essa biblioteca
e implant-la no sistema.
Para implantar essa biblioteca, teremos que substituir as classes que atualmente cuidam do controle de ponto pelas classes dessa biblioteca. A complexidade dessa substituio alta pois os mto42
www.k19.com.br
43
PADRES E STRUTURAIS
dos das classes antigas no so compatveis com os mtodos das classes novas. Em outras palavras,
as interfaces so diferentes.
Para tentar minimizar o impacto dessa substituio no cdigo do sistema, podemos definir classes intermedirias para adaptar as chamadas s classes da biblioteca que foi adquirida.
Por exemplo, atualmente, a entrada de um funcionrio registrada da seguinte maneira:
1
2
3
Utilizando as classes da nova biblioteca, a entrada de um funcionrio deveria ser registrada assim:
1
2
3
4
5
Dessa forma, o cdigo do sistema atual deve ser modificado apenas no trecho em que a classe
responsvel pelo controle de ponto instanciada.
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
www.k19.com.br
43
PADRES E STRUTURAIS
Client
44
Target
<<usa>>
request()
Adapter
request()
Adaptee
specificRequest()
Target (ControleDePonto)
Define a interface utilizada pelo Client.
Adaptee (ControleDePontoNovo)
Classe que define o novo objeto a ser utilizado.
Adapter (ControleDePontoAdapter)
Classe que implementa a interface definida pelo Target e adapta as chamadas do Client para
o Adaptee.
Client
Interage com os objetos atravs da interface definida por Target.
Exerccios de Fixao
1
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
44
www.k19.com.br
45
5
6
7
8
9
10
11
12
13
14
15
16
17
PADRES E STRUTURAIS
" dd / MM / yyyy H : m : s " ) ;
String format = simpleDateFormat . format ( calendar . getTime () ) ;
System . out . println ( " Entrada : " + f . getNome () + " s " + format ) ;
}
public void registraSaida ( Funcionario f ) {
Calendar calendar = Calendar . getInstance () ;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat (
" dd / MM / yyyy H : m : s " ) ;
String format = simpleDateFormat . format ( calendar . getTime () ) ;
System . out . println ( " Sada : " + f . getNome () + " s " + format ) ;
}
}
Cdigo Java 3.6: ControleDePonto.java
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
www.k19.com.br
45
PADRES E STRUTURAIS
46
1
2
3
4
5
6
7
8
9
Bridge
Objetivo: Separar uma abstrao de sua representao, de forma que ambos possam variar e produzir tipos de objetos diferentes.
Hoje em dia, os celulares utilizam cartes SIM (subscriber identity module). Entre outros dados,
esses cartes armazenam o nmero do telefone, a chave de autenticao do cliente e um identificador da rede a ser usada na comunicao.
Antes de ser capaz de fazer ligaes, o celular precisa passar pelo processo de autenticao. Nesse
processo, o celular troca informaes com a rede mvel a fim de verificar a identidade do usurio.
Alm de armazenar toda informao necessria para essa autenticao, o carto SIM quem de
fato executa os algoritmos de criptografia usados nesse processo, e no o aparelho celular. Uma vez
que a autenticao feita, o celular torna-se capaz de fazer ligaes.
A maioria dos celulares disponveis hoje em dia capaz de lidar com diversas operadoras, bastando apenas que o carto SIM do celular seja substitudo. Essa uma das vantagens dessa tecnologia.
Se o seu aparelho celular estiver danificado ou sem bateria, voc pode simplesmente remover
o carto SIM do aparelho e coloc-lo em outro. Por outro lado, se voc viajar para outro pas, por
exemplo, voc pode levar o seu aparelho celular e adquirir um carto SIM de uma operadora local.
46
www.k19.com.br
47
PADRES E STRUTURAIS
3G
*A
alt
1
w
4:08 PM
Z
aA
T
G
space
, .
sym
@
P
del
$
aA
Exemplo prtico
Estamos desenvolvendo um sistema que deve gerar diversos tipos de documentos (recibos, atestados, comunicados, etc) em diversos formatos de arquivos (txt, html, pdf, etc).
Podemos definir uma interface para padronizar os diversos tipos de documentos que o nosso
sistema pode suportar.
1
2
3
47
PADRES E STRUTURAIS
1
2
3
4
5
6
7
48
Dessa forma, a lgica dos documentos seria definida nas classes que implementam a interface
Documento. Para dividir melhor as responsabilidades, podemos implementar a lgica dos formatos
de arquivos que o sistema suportar em outras classes. Inclusive, podemos definir uma interface
para padronizar essas classes.
1
2
3
1
2
3
4
5
1
2
3
4
5
Por fim, os documentos devem ser associados aos geradores de arquivos. Isso pode ser realizado
atravs de construtores nas classes especficas de documentos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
48
www.k19.com.br
49
2
3
4
5
PADRES E STRUTURAIS
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Client
<<usa>>
Abstraction
Implementor
operation()
operationImpl()
RefinedAbstraction
ConcreteImplementorA
ConcreteImplementorB
operationImpl()
operationImpl()
Exerccios de Fixao
8
1
2
3
www.k19.com.br
49
PADRES E STRUTURAIS
50
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
11
1
2
3
4
5
6
12
A classe Recibo somente gera arquivo no formato txt. Para suportar mais formatos, podemos
definir a lgica de gerar arquivos em diversos formatos em outras classes. Vamos padronizar estas
classes atravs de uma interface.
1
2
3
13
1
2
3
4
5
6
7
50
www.k19.com.br
51
8
9
10
11
PADRES E STRUTURAIS
e . printStackTrace () ;
}
}
}
Cdigo Java 3.22: GeradorDeArquivoTXT.java
14
Associe os geradores de arquivos aos documentos. Altere a classe Recibo para receber um gerador de arquivo como parmetro no construtor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
15
1
2
3
4
5
6
7
8
Composite
Objetivo: Agrupar objetos que fazem parte de uma relao parte-todo de forma a trat-los sem
distino.
www.k19.com.br
51
PADRES E STRUTURAIS
52
Exemplo prtico
Suponha que estamos desenvolvendo um sistema para calcular um caminho entre quaisquer
dois pontos do mundo. Um caminho pode ser percorrido de diversas maneiras: p, de carro, de
nibus, de trem, de avio, de navio, etc.
52
www.k19.com.br
53
PADRES E STRUTURAIS
Aeroporto Augusto
Severo - NAT
Aeroporto de
Guarulhos - GRU
Avio
Terminal Rodovirio
do Tiet
nibus
Txi
Metr
p
Natal - RN
K19
C
Natal - RN K19
T
Natal - RN NAT
LEGENDA
C
Caminho
Txi
Avio
nibus
A
NAT GRU
O
GRU TIET
C
TIET K19
M Metr
P
www.k19.com.br
53
PADRES E STRUTURAIS
54
O sistema deve apresentar graficamente para os usurios as rotas que forem calculadas. Cada
tipo de trecho deve ser apresentado de uma maneira especfica. Por exemplo, se o trecho for de
caminhada ento deve aparecer na impresso da rota a ilustrao de uma pessoa andando.
Cada tipo de trecho pode ser implementado por uma classe e seria interessante definir uma interface para padroniz-las.
1
2
3
1
2
3
4
5
6
7
1
2
3
4
5
6
7
O prprio caminho entre dois pontos pode ser considerado um trecho. Basicamente, um caminho um trecho composto por outros trechos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
54
www.k19.com.br
55
5
6
7
8
9
10
11
PADRES E STRUTURAIS
Caminho caminho1 = new Caminho () ;
caminho1 . adiciona ( trecho1 ) ;
caminho1 . adiciona ( trecho2 ) ;
Caminho caminho2 = new Caminho () ;
caminho2 . adiciona ( caminho1 ) ;
caminho2 . adiciona ( trecho3 ) ;
Cdigo Java 3.29: Criando um caminho
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
<<interface>>
Component
operation()
Leaf
Composite
operation()
add()
remove()
operation()
Exerccios de Fixao
16
17
1
2
3
www.k19.com.br
55
PADRES E STRUTURAIS
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
56
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Defina uma classe Caminho que um Trecho e ser composto por um ou mais trechos.
public class Caminho implements Trecho {
private List < Trecho > trechos ;
public Caminho () {
this . trechos = new ArrayList < Trecho >() ;
}
public void adiciona ( Trecho trecho ) {
this . trechos . add ( trecho ) ;
}
public void remove ( Trecho trecho ) {
this . trechos . remove ( trecho ) ;
}
public void imprime () {
for ( Trecho trecho : this . trechos ) {
trecho . imprime () ;
}
}
}
Cdigo Java 3.33: Caminho.java
56
www.k19.com.br
57
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PADRES E STRUTURAIS
Crie uma classe para testar e criar um caminho que composto por mais de um trecho.
public class TestaCaminho {
public static void main ( String [] args ) {
Trecho trecho1 = new TrechoAndando (
" V at o cruzamento da Av . Rebouas com a Av . Brigadeiro Faria Lima " ,
500) ;
Trecho trecho2 = new TrechoDeCarro (
" V at o cruzamento da Av . Brigadeiro Faria Lima com a Av . Cidade Jardim " ,
1500) ;
Trecho trecho3 = new TrechoDeCarro (
" Vire a direita na Marginal Pinheiros " , 500) ;
Caminho caminho1 = new Caminho () ;
caminho1 . adiciona ( trecho1 ) ;
caminho1 . adiciona ( trecho2 ) ;
System . out . println ( " Caminho 1 : " ) ;
caminho1 . imprime () ;
Caminho caminho2 = new Caminho () ;
caminho2 . adiciona ( caminho1 ) ;
caminho2 . adiciona ( trecho3 ) ;
System . out . println ( " ---------------" ) ;
System . out . println ( " Caminho 2: " ) ;
caminho2 . imprime () ;
}
}
Decorator
Objetivo: Adicionar funcionalidade a um objeto dinamicamente.
Considere um mapa de ruas digital, como o Google Maps, por exemplo. natural que o mapa
contenha os nomes das ruas. Contudo, o mapa tambm poderia exibir diversas outras informaes
(como, por exemplo, relevo, indicadores de estabelecimentos de comrcio e servio), bem como oferecer opes para encontrar caminhos entre dois pontos e traar rotas.
www.k19.com.br
57
PADRES E STRUTURAIS
58
Rua
Av.
Tav
Eus
bio
are
sC
abr
al
Ma
tos
Av. Rebouas
100m
R. Henrique Monteiro
Av. Rebouas
100m
Av.
Tav
Eus
bio
are
sC
abr
al
Ma
tos
Av. Rebouas
Rua
R. Henrique Monteiro
Av. Rebouas
K19
100m
Tav
Av.
Eus
bio
are
sC
Ma
abr
tos
Av. Rebouas
al
Rua
_
R. Henrique Monteiro
Av. Rebouas
K19
100m
www.k19.com.br
59
PADRES E STRUTURAIS
Exemplo prtico
Como exemplo prtico do padro Factory Method, consideramos um sistema de envio de mensagens. Nesse exemplo, definimos uma interface para padronizar os emissores.
1
2
3
www.k19.com.br
59
PADRES E STRUTURAIS
60
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
60
www.k19.com.br
61
PADRES E STRUTURAIS
<<interface>>
Component
operation()
Decorator
ConcretComponent
operation()
operation()
ConcreteDecoratorA
operation()
ConcreteDecoratorB
operation()
Component (Emissor)
Define a interface de objetos que possuem determinada tarefa.
ConcreteComponent (EmissorBasico)
Implementao particular do Component.
Decorator (EmissorDecorator)
Classe abstrata que mantm uma referncia para um Component e ser utilizada para padronizar os objetos decoradores.
ConcreteDecorator (EmissorDecoratorComCriprografia, EmissorDecoratorComCompressao)
Implementao de um Decorator.
Exerccios de Fixao
21
22
1
2
3
23
1
2
3
4
www.k19.com.br
61
PADRES E STRUTURAIS
5
6
62
}
}
Cdigo Java 3.42: EmissorBasico.java
24
1
2
3
4
5
6
7
8
9
10
11
12
13
25
Crie um decorador que envia mensagens criptografadas e outro que envia mensagens comprimidas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
62
www.k19.com.br
63
21
22
23
24
25
PADRES E STRUTURAIS
dout . write ( mensagem . getBytes () ) ;
dout . close () ;
return new String ( out . toByteArray () ) ;
}
}
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Teste os decoradores.
public class TesteEmissorDecorator {
public static void main ( String [] args ) {
String mensagem = " " ;
Emissor emissorCript = new EmissorComCriptografia ( new EmissorBasico () ) ;
emissorCript . envia ( mensagem ) ;
Emissor emissorCompr = new EmissorComCompressao ( new EmissorBasico () ) ;
emissorCompr . envia ( mensagem ) ;
Emissor emissorCriptCompr = new EmissorComCriptografia ( new EmissorComCompressao ( new EmissorBasico () ) ) ;
emissorCriptCompr . envia ( mensagem ) ;
}
}
Facade
Objetivo: Prover uma interface simplificada para a utilizao de vrias interfaces de um subsistema.
Considere uma pessoa planejando suas prximas frias de vero. Ela poderia comprar a passagem area, reservar o hotel e agendar passeios, tudo por conta prpria.
Entretanto, tudo isso poderia ser muito trabalhoso. Em particular, ela precisaria pesquisar preos, comparar opes, reservar o hotel de acordo com as datas de chegada e sada de seu voo, etc.
nesse ponto que entram as agncias de viagens. Elas podem facilitar essa tarefa e trazer comodidade quele que deseja viajar, atuando como um intermedirio entre o cliente e as companhias
areas, hotis e empresas de passeio.
www.k19.com.br
63
PADRES E STRUTURAIS
64
K19 Viagens
Figura 3.9: Pessoa comprando um pacote oferecido por uma agncia de viagens
Exemplo prtico
Estamos melhorando um sistema que realiza todos os procedimentos que devem ser realizados
aps o registro de um pedido. Quando um pedido realizado, o mdulo que gerencia o estoque deve
ser avisado para que o produto seja encaminhado ao endereo de entrega. O mdulo financeiro deve
ser avisado para que o processo de faturamento seja realizado. O mdulo de ps venda tambm
deve ser avisado para que contatos futuros sejam realizados com o cliente com o intuito de verificar
a satisfao do mesmo com o produto obtido.
O sistema j est funcionando e realiza todos os processos decorrentes da realizao de um novo
pedido. Mas, queremos simplificar essa lgica encapsulando as chamadas aos mdulos de estoque,
financeiro e de ps venda.
1
2
3
4
Pedido p = ...
estoque . enviaProduto ( p . getProduto () , p . getEnderecoDeEntrega () , p . getNotaFiscal () ) ;
finaceiro . fatura ( p . getCliente () , p . getNotaFiscal () ) ;
posVenda . agendaContato ( p . getCliente () , p . getProduto () ) ;
Cdigo Java 3.47: disparando os processos decorrentes de um novo pedido
A ideia aqui criar uma classe que encapsula todos os processos que envolvem o acesso aos
mdulos de estoque, financeiro e de ps venda.
64
www.k19.com.br
65
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PADRES E STRUTURAIS
public class PedidoFacade {
private Estoque estoque ;
private Financeiro financeiro ;
private PosVenda posVenda ;
public PedidoFacade ( Estoque estoque , Financeiro financeiro , PosVenda posVenda ) {
this . estoque = estoque ;
this . financeiro = financeiro ;
this . posVenda = posVenda ;
}
public void registraPedido ( Pedido p ) {
this . estoque . enviaProduto ( p . getProduto () , p . getEnderecoDeEntrega () , p . getNotaFiscal () ) ;
this . financeiro . fatura ( p . getCliente () , p . getNotaFiscal () ) ;
this . posVenda . agendaContato ( p . getCliente () , p . getProduto () ) ;
}
public void cancelaPedido ( Pedido p ) {
// logica para cancelar pedidos
}
}
Cdigo Java 3.48: PedidoFacade.java
Agora, quando um pedido realizado, no mais necessrio acessar diretamente diversos mdulos diferentes, diminuindo assim a complexidade das operaes.
1
2
3
Pedido p = ...
PedidoFacade pedidoFacade = ...
pedidoFacade . registraPedido ( p ) ;
Cdigo Java 3.49: Registrando um pedido
Pedido p = ...
PedidoFacade pedidoFacade = ...
pedidoFacade . cancelaPedido ( p ) ;
Cdigo Java 3.50: Cancelando um pedido
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
ComponentA
Client
<<usa>>
Facade
<<usa>>
ComponentB
ComponentC
Figura 3.10: UML do padro Facade
www.k19.com.br
65
PADRES E STRUTURAIS
66
Exerccios de Fixao
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
66
www.k19.com.br
67
1
2
3
4
5
6
7
PADRES E STRUTURAIS
public class Financeiro {
public void fatura ( String cliente , String produto ) {
System . out . println ( " Fatura : " ) ;
System . out . println ( " Cliente : " + cliente ) ;
System . out . println ( " Produto : " + produto ) ;
}
}
Cdigo Java 3.53: Financeiro.java
1
2
3
4
5
6
7
8
9
10
11
29
Crie uma classe PedidoFacade que encapsula o acesso aos mdulos de estoque, financeiro e
ps venda.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
30
1
2
3
4
5
6
7
8
9
10
11
www.k19.com.br
67
PADRES E STRUTURAIS
68
Exemplo prtico
O nosso framework deve interceptar todas as requisies HTTP para realizar esses passos. Para
interceptar as requisies HTTP, podemos implementar uma Servlet.
1
2
3
4
5
6
7
8
9
As tarefas que devem ser realizadas em todas as requisies podem ser implementadas nessa
Servlet. Por outro lado, as tarefas especficas devem ser delegadas para outra parte do framework ou
para a aplicao.
68
www.k19.com.br
69
PADRES E STRUTURAIS
Aplicao WEB
Requisio HTTP
Lgica de
Negcio
FRONT
CONTROLLER
Lgica de
Apresentao
Resposta HTTP
- Segurana
- Controle de erro
Exerccios de Fixao
31
32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
www.k19.com.br
69
PADRES E STRUTURAIS
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
70
34
1
2
3
4
5
6
7
package controllers ;
public class Teste {
public void teste () {
System . out . println ( " Teste . teste () " ) ;
}
}
Cdigo Java 3.59: Teste.java
35
1
2
3
4
5
6
7
8
9
36
http://localhost:8080/FrontController/Teste/teste.k19
Flyweight
Objetivo: Compartilhar, de forma eficiente, objetos que so usados em grande quantidade.
Exemplo prtico
Estamos desenvolvendo uma aplicao para gerenciar milhares de apresentaes com slides.
Essa aplicao disponibilizar um conjunto de temas que podem ser aplicados individualmente em
70
www.k19.com.br
71
PADRES E STRUTURAIS
Sigla: K11
Nome: Orientao a Objetos em Java
Carga horria: 36h
Sigla: K12
Nome: Desenvolvimento Web com
JSF2 e JPA2
Carga horria: 36h
Carga Horria:
A interface TemaFlyweight define um mtodo que recebe o contedo dos slides e deve aplicar a
formatao correspondente ao tema. Com a interface definida, podemos implementar alguns temas
especficos.
1
2
3
4
5
1
2
3
4
5
www.k19.com.br
71
PADRES E STRUTURAIS
72
1
2
3
4
5
Para controlar a criao e acesso dos objetos que definem os temas, podemos implementar a
seguinte classe.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Por fim, deveramos associar os slides aos temas. Isso poderia ser feito atravs do construtor da
classe que define os slides.
1
2
3
4
5
6
7
1
2
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
72
www.k19.com.br
73
PADRES E STRUTURAIS
<<interface>>
Flyweight
FlyweightFactory
getFlyweight(id)
operation()
ConcreteFlyweight1
operation()
Client
ConcreteFlyweight1
operation()
<<usa>>
Exerccios de Fixao
37
38
1
2
3
39
1
2
3
4
5
6
7
8
9
www.k19.com.br
73
PADRES E STRUTURAIS
1
2
3
4
5
6
7
8
9
74
1
2
3
4
5
6
7
8
9
10
11
12
13
40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static TemaFlyweight getTema ( Class <? extends TemaFlyweight > clazz ) {
if (! temas . containsKey ( clazz ) ) {
try {
temas . put ( clazz , clazz . newInstance () ) ;
} catch ( Exception e ) {
e . printStackTrace () ;
}
}
return temas . get ( clazz ) ;
}
}
Cdigo Java 3.71: TemaFlyweightFactory.java
41
1
2
3
4
5
6
7
8
9
10
11
12
74
www.k19.com.br
75
13
14
15
PADRES E STRUTURAIS
this . tema . imprime ( titulo , texto ) ;
}
}
Cdigo Java 3.72: Slide.java
42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
43
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Proxy
Objetivo: Controlar as chamadas a um objeto atravs de outro objeto de mesma interface.
Se uma queda de energia ocorrer enquanto estamos desenvolvendo um trabalho no computador, este trabalho pode ser perdido. Para evitar situaes como essa, podemos utilizar um no-break.
www.k19.com.br
75
PADRES E STRUTURAIS
76
Aps uma interrupo no fornecimento de energia, este aparelho mantm o computador ligado por
tempo suficiente para que possamos salvar o nosso trabalho.
Para isso, o computador deve estar conectado ao no-break e no tomada. O no-break, por sua
vez, deve estar conectado tomada.
No queremos alterar o plugue do computador, portanto interessante que o no-break possua o
mesmo encaixe que a tomada.
Essa a mesma ideia do padro Proxy. Esse padro define um intermedirio para controlar o
acesso a um determinado objeto, podendo adicionar funcionalidades que esse objeto no possui.
Exemplo prtico
Estamos desenvolvendo uma aplicao bancria que deve registrar todas as operaes realizadas pelos objetos que representam as contas do banco. O registro das operaes pode ser utilizado
posteriormente em uma auditoria.
Para manter o sistema mais coeso, no queremos implementar o registro das operaes dentro
dos objetos que representam as contas. A ideia implementar essa lgica em objetos intermedirios. Para preservar o modo de utilizao das contas, podemos manter a interface nesses objetos
intermedirios.
Podemos definir uma interface para padronizar os mtodos dos objetos que representam as contas e os objetos intermedirios responsveis pelo registro das operaes.
1
2
3
4
5
76
www.k19.com.br
77
5
6
7
8
9
10
11
12
13
14
15
PADRES E STRUTURAIS
this . saldo += valor ;
}
public void saca ( double valor ) {
this . saldo -= valor ;
}
public double getSaldo () {
return this . saldo ;
}
}
Cdigo Java 3.76: ContaPadrao.java
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Client
<<usa>>
<<interface>>
Subject
request()
Proxy
request()
RealSubject
request()
77
PADRES E STRUTURAIS
78
Subject (Conta)
Interface que padroniza RealSubject e Proxy.
RealSubject (ContaPadro)
Define um tipo de objeto do domnio da aplicao.
Proxy (ContaProxy)
Define os objetos que controlam o acesso aos RealSubjects.
Client
Cliente que usa o RealSubject por meio do Proxy.
Exerccios de Fixao
44
45
1
2
3
4
5
46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
47
Crie uma classe intermediria ContaProxy que far os registros das operaes.
1
2
3
4
5
6
7
8
9
78
www.k19.com.br
79
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PADRES E STRUTURAIS
System . out . println ( " Depsito de R$ " + valor + " efetuado ... " ) ;
}
public void saca ( double valor ) {
System . out . println ( " Efetuando o saque de R$ " + valor ) ;
this . conta . saca ( valor ) ;
System . out . println ( " Saque de R$ " + valor + " efetuado . " ) ;
}
public double getSaldo () {
System . out . println ( " Verificando o saldo ... " ) ;
return this . conta . getSaldo () ;
}
}
Cdigo Java 3.80: ContaProxy.java
48
1
2
3
4
5
6
7
8
9
www.k19.com.br
79
PADRES E STRUTURAIS
80
80
www.k19.com.br
CAPTULO
PADRES C OMPORTAMENTAIS
Command
Objetivo: Controlar as chamadas a um determinado componente, modelando cada requisio
como um objeto. Permitir que as operaes possam ser desfeitas, enfileiradas ou registradas.
Exemplo prtico
Estamos desenvolvendo um aplicativo para gerenciar playlists de msica. Os usurios podero
selecionar as suas msicas favoritas e definir a ordem na qual elas devem ser reproduzidas. Um
playlist basicamente uma sequncia de msicas. Contudo, o aplicativo pode adicionar, entre as
msicas de um playlist, comandos para aumentar ou diminuir o volume de reproduo.
Vamos utilizar uma biblioteca de udio para desenvolver esse aplicativo. Atravs dessa biblioteca, podemos tocar msicas e controlar o volume das sadas de udio.
www.k19.com.br
81
PADRES C OMPORTAMENTAIS
1
2
3
4
5
6
7
8
9
10
11
12
13
82
Os trs mtodos da classe Player so bloqueantes. Por exemplo, o mtodo play() s termina
quando a msica que est sendo reproduzida terminar.
Devemos controlar os comandos enviados ao player da biblioteca para poder implementar o
nosso aplicativo. Vamos definir uma interface para padronizar os comandos e criar classes para
modelar os comandos.
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
82
www.k19.com.br
83
3
4
5
6
7
8
9
10
11
12
13
PADRES C OMPORTAMENTAIS
private int levels ;
public DiminuiVolumeComando ( Player player , int levels ) {
this . player = player ;
this . levels = levels ;
}
public void executa () {
this . player . decreaseVolume ( this . levels ) ;
}
}
Agora, devemos implementar uma classe que dispara os comandos na ordem definida pelo usurio.
1
2
3
4
5
6
7
8
9
10
11
12
13
Por fim, teramos que criar os comandos associados a um player e depois adicion-los em um
playlist.
1
2
3
4
5
6
7
8
9
10
listaDeComandos . executa () ;
Organizao
83
PADRES C OMPORTAMENTAIS
84
<<interface>>
Command
Invoker
execute()
<<usa>>
Client
<<cria>>
ConcreteCommand1
ConcreteCommand2
execute()
execute()
Receiver
<<usa>>
action1()
action2()
<<cria>>
Command (Comando)
Define uma interface para a execuo dos mtodos do Receiver.
ConcreteCommand (TocaMusicaComando, AumentaVolumeComando, DiminuiVolumeComando)
Classe que implementa Command e modela uma operao especfica do Receiver.
Invoker (ListaDeComandos)
Classe que armazena os Commands que devem ser executados.
Receiver (Player)
Define os objetos que tero as chamadas aos seus mtodos controladas.
Client
Instancia os Commands associando-os ao Receiver e armazena-os no Invoker.
Exerccios de Fixao
1
1
2
3
4
5
6
7
8
9
10
11
12
84
www.k19.com.br
85
13
14
15
16
17
PADRES C OMPORTAMENTAIS
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
www.k19.com.br
85
PADRES C OMPORTAMENTAIS
12
13
86
}
}
Cdigo Java 4.12: DiminuiVolumeComando.java
Defina uma classe ListaDeComandos que conter a lista de comandos na ordem definida pelo
usurio.
5
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
listaDeComandos . executa () ;
}
}
Cdigo Java 4.14: TestaListaComandos.java
Iterator
Objetivo: Fornecer um modo eficiente para percorrer sequencialmente os elementos de uma coleo, sem que a estrutura interna da coleo seja exposta.
Considere um turista que pretende visitar os principais pontos tursticos de determinada cidade.
Infelizmente, ele no pde planejar seus passeios e no sabe quais pontos tursticos existem nessa
cidade. Alm disso, seu perodo de permanncia na cidade curto.
Para tornar sua experincia mais agradvel, o turista pode solicitar o servio de um guia turstico.
Guias conhecem muito bem a cidade onde atuam e sabem definir um bom roteiro para a visitao
dos pontos tursticos.
86
www.k19.com.br
87
PADRES C OMPORTAMENTAIS
87
PADRES C OMPORTAMENTAIS
88
Exemplo prtico
A maior parte das aplicaes necessitam de estruturas de dados para organizar as informaes
armazenadas na memria. Cada estrutura estabelece um determinado conjunto de restries relacionadas aos dados e disponibilizam operaes eficientes para que possamos manipular as informaes.
Em geral, as plataformas de desenvolvimento de aplicaes oferecem, atravs de bibliotecas, diversas estruturas de dados para facilitar o trabalho dos programadores. Por exemplo, na plataforma
Java, as classes ArrayList, LinkedList, Vector, HashSet e TreeSet so exemplos de implementaes disponveis.
Muitas vezes, necessrio percorrer todos os elementos de uma estrutura de dados para realizar
uma determinada tarefa. A organizao interna de cada estrutura complexa e deve estar encapsulada nas classes que as implementam. Dessa forma, em geral, o desenvolvedor no teria as condies
necessrias para percorrer os elementos da estrutura de dados utilizada.
Podemos encapsular o processo de visitar cada elemento de uma estrutura de dados dentro dela
mesma. Essa abordagem interessante pois cada estrutura conhece a sua organizao interna podendo, dessa forma, implementar esse processo da maneira mais eficiente.
Na plataforma Java, as estruturas que possuem a capacidade de ter os seus elementos percorridos
implementam uma interface que abstrai a ideia desse processo.
1
2
3
Toda estrutura de dados que implementa a interface Iterable deve produzir objetos da interface
Iterator. Os objetos da interface Iterator funcionam como guias que indicam o melhor caminho
para visitar os elementos de uma determinada estrutura.
1
2
3
4
5
Do ponto de vista do programador, a complexidade para percorrer os elementos de uma estrutura de dados est escondida dentro do iterator.
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
88
www.k19.com.br
89
PADRES C OMPORTAMENTAIS
Aggregate
<<usa>>
createIterator()
ConcreteAggregate1
ConcreteAggregate2
Client
<<cria>>
<<usa>>
Iterator
next()
hasNext()
ConcreteIterator1
ConcreteIterator2
<<cria>>
Exerccios de Fixao
7
Defina uma classe ListaDeNomes que implementa a interface Iterable e mantm a lista de
nomes num array.
8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
www.k19.com.br
89
PADRES C OMPORTAMENTAIS
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Mediator
Objetivo: Diminuir a quantidade de ligaes entre objetos introduzindo um mediador, atravs
do qual toda comunicao entre os objetos ser realizada.
Considere a rede de telefonia fixa. Ela permite que ligaes telefnicas sejam realizadas entre
quaisquer dois aparelhos dessa rede. Obviamente, os aparelhos no esto diretamente conectados
entre si dois a dois. Tente imaginar a quantidade de fios que teria de estar conectada a cada aparelho.
Os telefones esto conectados a uma central que distribui as ligaes de acordo com o nmero
discado, criando uma ligao temporria entre os dois aparelhos.
90
www.k19.com.br
91
PADRES C OMPORTAMENTAIS
A ideia do padro Mediator semelhante ideia da central telefnica. Eliminar conexes excessivas entre elementos por meio da introduo de um intermedirio nico.
www.k19.com.br
91
PADRES C OMPORTAMENTAIS
92
Exemplo prtico
Estamos desenvolvendo um sistema para controlar o fluxo de txis e passageiros em um aeroporto. Os txis disponveis ficam a espera de passageiros em uma fila organizada pela ordem de
chegada. Da mesma forma, os passageiros que desejam utilizar um txi ficam em uma fila de espera
que tambm organizada pela ordem de chegada.
Criaremos uma classe para modelar os passageiros, outra para os txis e uma terceira para mediar
a comunicao entre esses objetos.
1
2
3
1
2
3
1
2
3
A central de txi deve manter uma fila com os txis disponveis e outra com os passageiros em
espera.
1
2
3
4
Alm disso, a central de txi deve disponibilizar um mtodo que ser acionado por um txi
quando esse fica disponvel, e outro que ser chamado por um passageiro quando esse entrar na
fila de espera.
1
2
3
4
5
6
7
8
9
10
11
12
92
www.k19.com.br
93
PADRES C OMPORTAMENTAIS
Para poder se comunicar com a central de txi, tanto os txis quanto os passageiros devem ter
uma referncia para a central. Essas ligaes podem ser estabelecidas atravs dos construtores das
classes Passageiro e Taxi.
1
2
3
4
5
6
1
2
3
4
5
6
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Client
<<usa>>
<<usa>>
<<chama>>
Mediator
Colleague
<<chama>>
Figura 4.5: UML do padro Mediator
Exerccios de Fixao
www.k19.com.br
93
PADRES C OMPORTAMENTAIS
94
10
11
1
2
3
4
5
6
1
2
3
4
5
6
1
2
3
4
5
6
7
8
9
10
11
12
12
94
www.k19.com.br
95
PADRES C OMPORTAMENTAIS
13
Adicione classe Taxi um mtodo para simular uma corrida de txi. Adicione tambm um
atributo para identificar o txi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
14
15
www.k19.com.br
95
PADRES C OMPORTAMENTAIS
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
96
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Observer
Objetivo: Definir um mecanismo eficiente para reagir s alteraes realizadas em determinados
objetos.
Considere um supermercado em que os caixas possuem uma fila nica. Cada caixa identificado
por um nmero, que exibido em uma placa sua frente. Esse nmero fica visvel todos os clientes
da fila.
Tambm visvel aos clientes da fila, existe um painel que exibe o nmero de identificao do
prximo caixa disponvel (se houver algum).
96
www.k19.com.br
97
PADRES C OMPORTAMENTAIS
O painel precisa saber sobre as mudanas no estado (livre ou ocupado) de cada caixa para atualizar o seu mostrador.
Uma possibilidade fazer o painel consultar, periodicamente, o estado de cada caixa. Contudo,
essa pode ser uma abordagem ineficiente, principalmente quando o estado dos caixas no alterado
frequentemente.
Uma outra possibilidade fazer com que cada caixa avisasse ao painel sobre uma mudana em
seu estado.
Nessa abordagem, no momento em que um caixa fica disponvel ou ocupado, ele poderia passar
o seu nmero de identificao para o painel, para inform-lo sobre a sua mudana de estado. O
painel, por sua vez, atualizaria o nmero exibido quando necessrio.
A ideia fundamental do padro Observer atribuir aos objetos que tem seus estados alterados a
tarefa de notificar os objetos interessados nessas mudanas. Em nosso exemplo, os caixas notificam
o painel sobre alteraes em seus estados.
www.k19.com.br
97
PADRES C OMPORTAMENTAIS
98
Exemplo prtico
Estamos desenvolvendo um sistema para o mercado financeiro. Esse sistema deve manter todos
os interessados em uma determinada ao informados do valor da mesma. Toda alterao no valor
de uma ao deve ser informada aos seus respectivos interessados.
Podemos ter vrios tipos de interessados. Por exemplo, uma pessoa fsica, uma empresa, um rgo pblico, entre outros. Para manter uma padronizao na modelagem, definiremos uma interface
para os interessados.
1
2
3
Por outro lado, a classe Acao deve aceitar interessados (observadores) e avis-los quando o seu
valor for alterado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
98
www.k19.com.br
99
PADRES C OMPORTAMENTAIS
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
<<chama>>
Subject
attach(Observer)
detach(Observer)
getState()
attach(Observer)
detach(Observer)
getState()
<<chama>>
ConcreteSubject1
ConcreteSubject1
Observer
attach(Observer)
detach(Observer)
getState()
update(Subject)
ConcreteObserver1
ConcreteObserver2
update(Subject)
update(Subject)
Observer (AcaoObserver)
Interface dos objetos interessados no estado dos Subjects.
ConcreteObserver (Corretora)
Implementao particular de um Observer.
Subject
Interface usada para padronizar os objetos que sero observados.
ConcreteSubject (Acao)
Implementao de um Subject.
Exerccios de Fixao
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
www.k19.com.br
99
PADRES C OMPORTAMENTAIS
16
17
18
19
20
21
100
}
public String getCodigo () {
return codigo ;
}
}
Cdigo Java 4.37: Acao.java
19
Para notificar os interessados sobre as alteraes nos valores da ao, devemos registrar os interessados e notific-los. Para padronizar a notificao dos interessados, criemos a interface AcaoObserver.
1
2
3
20
Altere a classe Acao para registrar os interessados e notific-los sobre a alterao no valor da
ao.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
21
Defina a classe Corretora e implemente a interface AcaoObserver para que as corretoras sejam
notificadas sobre as alteraes nos valores das aes.
1
2
3
100
www.k19.com.br
101
4
5
6
7
8
9
10
11
12
13
PADRES C OMPORTAMENTAIS
public Corretora ( String nome ) {
this . nome = nome ;
}
public void notificaAlteracao ( Acao acao ) {
System . out . println ( " Corretora " + this . nome + " sendo notificada : " ) ;
System . out . println ( " A ao " + acao . getCodigo ()
+ " teve o seu valor alterado para " + acao . getValor () ) ;
}
}
22
1
2
3
4
5
6
7
8
9
10
11
12
13
State
Objetivo: Alterar o comportamento de um determinado objeto de acordo com o estado no qual ele
se encontra.
Exemplo prtico
Estamos trabalhando em uma empresa que vende taxmetros para o mundo todo. Temos que
implementar a lgica para calcular o valor das corridas de acordo com a bandeira selecionada no
aparelho. O taxmetro pode ser configurado com diversas bandeiras.
www.k19.com.br
101
PADRES C OMPORTAMENTAIS
102
R$ 5,00
R$ 10,00
12:30
12:30
Vamos implementar uma interface para padronizar os mtodos das bandeiras do taxmetro.
1
2
3
Depois, necessrio definir as bandeiras do taxmetro de acordo com as necessidades locais, pois
as regras de clculo das corridas so diferentes para cada regio.
1
2
3
4
5
1
2
3
102
www.k19.com.br
103
4
5
PADRES C OMPORTAMENTAIS
}
}
Cdigo Java 4.45: Bandeira2.java
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Client
<<usa>>
State
Context
handle()
request()
ConcreteStateA
handle()
ConcreteStateB
handle()
State (Bandeira)
Interface para padronizar os estados do Context.
ConcreteState (Bandeira1, Bandeira2)
Implementao particular de um State.
Context (Taximetro)
Mantm uma referncia para um State que define o estado atual.
Exerccios de Fixao
www.k19.com.br
103
PADRES C OMPORTAMENTAIS
104
23
24
1
2
3
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
26
1
2
3
4
5
1
2
3
4
5
27
1
2
3
4
5
6
7
8
9
10
104
www.k19.com.br
105
11
12
13
14
15
16
PADRES C OMPORTAMENTAIS
taximetro . setBandeira ( b2 ) ;
double valor2 = taximetro . calculaValorDaCorrida (5 , 30) ;
System . out . println ( " Valor da corrida em bandeira 2: " + valor2 ) ;
}
}
Strategy
Objetivo: Permitir de maneira simples a variao dos algoritmos utilizados na resoluo de um
determinado problema.
Quando desejamos percorrer um trajeto entre dois pontos numa cidade, precisamos decidir qual
caminho devemos seguir. Podem haver diversos caminhos entre dois pontos, o que pode tornar a
escolha de um bom caminho um pouco difcil.
Existem algumas aplicaes que podem ajudar nessa tarefa, como o caso do Google Maps, por
exemplo. Normalmente, essas aplicaes permitem que o usurio escolha a forma ( p, de bicicleta,
de carro, ou usando o transporte pblico) que deseja percorrer o caminho. Essa escolha afeta os
passos para se chegar ao destino final.
www.k19.com.br
105
PADRES C OMPORTAMENTAIS
106
O padro Strategy prope uma soluo que pode ser adotada nesse cenrio. A ideia fundamental
desse padro possibilitar facilmente a variao do algoritmo a ser utilizado na resoluo de um
problema. Em nosso exemplo, diferentes algoritmos so usados para se encontrar uma rota entre
dois pontos, dependendo do modo como o usurio deseja percorrer o caminho.
Exemplo prtico
Uma tarefa muito comum no desenvolvimento de uma aplicao ordenar uma lista de elementos. Em Cincia da Computao, foram desenvolvidos diversos algoritmos de ordenao. Podemos
escolher o algoritmo mais apropriado de acordo com a situao.
De qualquer forma, todos os algoritmos de ordenao devem produzir o mesmo resultado, podendo variar no consumo de memria e no tempo gasto para realizar a ordenao.
Podemos definir uma interface para padronizar as diversas implementaes dos algoritmos de
ordenao.
106
www.k19.com.br
107
1
2
3
PADRES C OMPORTAMENTAIS
public interface Sorter {
<T extends Comparable <? super T > > List <T > sort ( List <T > list ) ;
}
Cdigo Java 4.52: Sorter.java
Agora, podemos criar uma classe para cada algoritmo que vamos implementar.
1
2
3
4
5
1
2
3
4
5
Agora podemos escolher qual algoritmo utilizar quando desejamos ordenar uma lista de elementos.
1
2
3
4
5
6
7
8
Organizao
O diagrama UML abaixo ilustra a organizao desse padro.
Client
<<usa>>
Stratergy
Context
algorithmInterface()
contextInterface()
ConcreteStratergyA
algorithmInterface()
ConcreteStratergyB
algorithmInterface()
107
PADRES C OMPORTAMENTAIS
108
Strategy (Sorter)
Interface para padronizar as diferentes estratgias de um algoritmo.
ConcreteStrategy (InsertionSorter, BubbleSorter)
Implementao particular de um Strategy.
Context
Mantm uma referncia para um objeto Strategy e pode permitir que esse acesse os seus
dados.
Exerccios de Fixao
28
29
1
2
3
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
108
www.k19.com.br
109
17
18
19
20
21
22
23
PADRES C OMPORTAMENTAIS
list . remove ( i ) ;
list . add (i , aux ) ;
}
}
return list ;
}
}
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Template Method
Objetivo: Definir a ordem na qual determinados passos devem ser realizados na resoluo de um
problema e permitir que esses passos possam ser realizados de formas diferentes de acordo com a situao.
Em 1913, Henry Ford introduziu o conceito de linha de montagem na produo de carros. Esse
processo permiti at hoje que carros sejam produzidos em grande escala. Em geral, toda linha de
montagem de carros possui trs etapas fundamentais: corte das chapas de ao, pintura do esqueleto
do carro e montagem dos componentes eltricos e mecnicos.
Em geral, essas trs etapas so realizadas na mesma ordem independentemente do tipo de carro
que est sendo produzido. Contudo, obviamente, para cada tipo de carro, essas etapas so realizadas
de maneiras diferentes.
www.k19.com.br
109
PADRES C OMPORTAMENTAIS
110
O padro de projeto Template Method possui caractersticas semelhantes s linhas de montagens de carros. A ideia fundamental desse padro definir a ordem de execuo dos passos que
resolvem um determinado problema e permitir que cada passo possa ser implementado de maneiras diferentes.
Exemplo prtico
Estamos desenvolvendo um sistema bancrio e precisamos modelar os diversos tipos de contas
do banco. Decidimos aplicar herana utilizando uma classe chamada Conta.
1
2
3
4
5
6
7
8
9
10
11
Toda operao bancria realizada gera a cobrana de uma taxa que diferente para cada tipo da
conta. Podemos tentar implementar um mtodo para calcular essa taxa na classe Conta e cham-lo
a partir dos outros mtodos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
110
www.k19.com.br
111
16
17
PADRES C OMPORTAMENTAIS
}
}
Contudo, nada pode ser definido no corpo do mtodo calculaTaxa() na classe Conta porque o
clculo diferente para cada tipo de conta bancria. A soluo tornar o mtodo abstrato para que
ele seja implementado nas classes das contas especficas. Dessa forma, os mtodos que chamam o
calculaTaxa() dependem de um mtodo que ser implementado posteriormente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
1
2
3
4
5
Organizao
111
PADRES C OMPORTAMENTAIS
112
AbstractClass
template()
primitiveOperation1()
primitiveOperation2()
ConcreteClass1
primitiveOperation1()
primitiveOperation2()
ConcreteClass2
primitiveOperation1()
primitiveOperation2()
AbstractClass (Conta)
Classe abstrata que define os templates methods baseados em mtodos abstratos que sero
implementados nas ConcreteClasses.
ConcreteClass (ContaCorrente, ContaPoupanca)
Classes concretas que implementam os mtodos abstratos definidos pela AbstractClass e
que so utilizados pelos templates methods.
Exerccios de Fixao
32
33
Defina a classe Conta e o mtodo abstrato calculaTaxa. A cada operao uma taxa cobrada.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
34
Defina as classes ContaCorrente e ContaPoupanca derivadas de Conta. As classes devero definir a taxa que ser cobrada.
112
www.k19.com.br
113
1
2
3
4
5
PADRES C OMPORTAMENTAIS
public class ContaCorrente extends Conta {
public double calculaTaxa () {
return 3;
}
}
Cdigo Java 4.66: ContaCorrente.java
1
2
3
4
5
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Visitor
Objetivo: Permitir atualizaes especficas em uma coleo de objetos de acordo com o tipo particular de cada objeto atualizado.
Exemplo prtico
Estamos desenvolvendo um sistema bancrio no qual os funcionrios devem ser classificados de
acordo com o cargo que eles possuem. Para modelar as diferenas e semelhanas relativas a cada
cargo decidimos aplicar o conceito de herana na nossa modelagem.
1
2
3
4
5
6
www.k19.com.br
113
PADRES C OMPORTAMENTAIS
1
2
3
4
5
114
1
2
3
4
5
Todo funcionrio do banco est associado a um departamento. Podemos aplicar agregao para
implementar essa condio.
1
2
3
4
1
2
3
4
5
6
7
8
Agora, suponha que no sistema h uma lista com todos os departamentos do banco. Queremos
aplicar um atualizador em todos os funcionrios de todos os departamentos dessa lista.
O esqueleto do cdigo seria mais ou menos assim:
1
2
114
www.k19.com.br
115
3
4
5
6
PADRES C OMPORTAMENTAIS
Contudo temos dois problemas: primeiro, possvel que o acesso aos funcionrios de um departamento esteja restrito, consequentemente, dentro do lao acima no poderamos executar o atualizador. Segundo, mesmo que o acesso esteja disponvel, teramos que testar o tipo dos funcionrios
de cada departamento para selecionar o mtodo correto de atualizao.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Para solucionar os dois problemas acima, podemos passar os atualizadores para dentro dos departamentos e dos funcionrios para que eles prprios chamem o mtodo correto de atualizao. Os
atualizadores podem ser passados para dentro dos departamentos e dos funcionrios atravs de um
mtodo padronizado por uma interface.
1
2
3
1
2
3
4
5
6
1
2
3
4
5
6
7
8
9
www.k19.com.br
115
PADRES C OMPORTAMENTAIS
1
2
3
4
5
6
7
8
9
116
Organizao
www.k19.com.br
117
PADRES C OMPORTAMENTAIS
Visitor
Client
visitElementA()
visitElementB()
ConcreteVisitor2
ConcreteVisitor1
visitElementA()
visitElementB()
visitElementA()
visitElementB()
Element
ObjectStructure
accept(Visitor)
ConcreteElement1
accept(Visitor)
ConcreteElement2
accept(Visitor)
Visitor (AtualizadorDeFuncionario)
Define a interface dos objetos responsveis pelas atualizaes dos Elements.
ConcreteVisitor (AtualizadorSalarial)
Implementa a lgica de uma determinada atualizao dos Elements.
Element (Atualizavel)
Define a interface dos objetos que podem ser atualizados por um Visitor.
ConcreteElement (Funcionario, Departamento)
Define um tipo especfico de Element.
ObjectStructure
Agregador dos Elements.
Client
Aplica um determinado Visitor nos Elements do ObjectStructure.
Exerccios de Fixao
36
37
1
2
www.k19.com.br
117
PADRES C OMPORTAMENTAIS
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
118
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
118
www.k19.com.br
119
16
PADRES C OMPORTAMENTAIS
}
Cdigo Java 4.86: Departamento.java
38
1
2
3
4
1
2
3
4
5
6
7
8
39
1
2
3
40
1
2
3
41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
www.k19.com.br
119
PADRES C OMPORTAMENTAIS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
120
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
120
www.k19.com.br
121
22
23
24
25
26
27
28
29
30
31
32
33
34
PADRES C OMPORTAMENTAIS
AtualizadorDeFuncionario atualizador = new AtualizadorSalarial () ;
for ( Departamento d : lista ) {
d . aceita ( atualizador ) ;
}
for ( Departamento d : lista ) {
for ( Funcionario f : d . getFuncionarios () ) {
System . out . println ( " Nome : " + f . getNome () + " - Salrio : " + f . getSalario () ) ;
}
}
}
}
Cdigo Java 4.94: TestaAtualizadorSalarial.java
www.k19.com.br
121