Escolar Documentos
Profissional Documentos
Cultura Documentos
Projeto de Sistemas
Orientados a Objetos
Jos Incio Serafini
Cuiab 2011
Governo Federal
Ministro de Educao
Fernando Haddad
Ifes Instituto Federal do Esprito Santo
Reitor
Dnio Rebello Arantes
Pr-Reitora de Ensino
Cristiane Tenan Schlittler dos Santos
Coordenadora do CEAD Centro de Educao a Distncia
Yvina Pavan Baldo
Coordenadoras da UAB Universidade Aberta do Brasil
Yvina Pavan Baldo
Maria das Graas Zamborlini
Curso de Tecnologia em Anlise e Desenvolvimento de Sistemas
Coordenao de Curso
Isaura Nobre
Designer Instrucional
Danielli Veiga Carneiro / Jos Mrio Costa Jnior
Professor Especialista/Autor
Jos Incio Serafini
CDD 005.117
DIREITOS RESERVADOS
Ifes Instituto Federal do Esprito Santo
Av. Vitria Jucutuquara Vitria ES - CEP - (27) 3331.2139
Crditos de autoria da editorao
Capa: Juliana Cristina da Silva
Projeto grfico: Juliana Cristina da Silva / Nelson Torres
Iconografia: Nelson Torres
Editorao eletrnica: Duo Translations
Reviso de texto:
Ilioni Augusta da Costa
Maria Madalena Covre da Silva
COPYRIGHT proibida a reproduo, mesmo que parcial, por qualquer meio, sem autorizao escrita dos autores
e do detentor dos direitos autorais.
Tecnologia em Anlise e Desenvolvimento de Sistemas
Ol, Aluno(a)!
um prazer t-lo conosco.
O Ifes oferece a voc, em parceria com as Prefeituras e com o Governo
Federal, o Curso Tecnologia em Anlise e Desenvolvimento de Sistemas, na modalidade a distncia. Apesar de este curso ser ofertado
a distncia, esperamos que haja proximidade entre ns pois, hoje,
graas aos recursos da tecnologia da informao (e-mails, chat, videoconferncia, etc.), podemos manter uma comunicao efetiva.
importante que voc conhea toda a equipe envolvida neste curso:
coordenadores, professores especialistas, tutores a distncia e tutores
presenciais porque, quando precisar de algum tipo de ajuda, saber a
quem recorrer.
Na EaD Educao a Distncia, voc o grande responsvel pelo
sucesso da aprendizagem. Por isso, necessrio que se organize para
os estudos e para a realizao de todas as atividades, nos prazos estabelecidos, conforme orientao dos Professores Especialistas e Tutores.
Fique atento s orientaes de estudo que se encontram no Manual
do Aluno!
A EaD, pela sua caracterstica de amplitude e pelo uso de tecnologias
modernas, representa uma nova forma de aprender, respeitando,
sempre, o seu tempo.
Desejamos-lhe sucesso!
Equipe do Ifes
Projeto de Sistemas
ICONOGRAFIA
Veja, abaixo, alguns smbolos utilizados neste material para gui-lo em seus estudos.
Fala do Professor
PROJETO DE SISTEMAS
Cap. 1 - Reviso de UML 13
1.1. UML 13
1.2. Diagramas de UML 13
1.3. Que diagramas devo utilizar em meus projetos? 20
1.4. Diagrama de Casos de Uso 20
1.4.1. Modelagem de Contexto
23
1.4.2. Modelagem de Requisitos 23
1.5. Diagramas de Classes 24
1.5.1. Relaes entre classes 25
1.6. Diagrama de Objetos 28
1.7. Diagrama de Componentes 29
1.8. Diagrama de Deployment 32
1.9. Diagrama de Sequncia 33
1.10. Diagrama de Colaborao 34
6.2.3. Ateno 97
6.3. Soluo 98
6.4. Diagrama UML 98
6.4.1. Participantes e Colaboradores 98
6.5. Observaes 98
6.6. Implementao 99
6.7. Exerccios 100
10
11
APRESENTAO
Ol,
Neste curso voc vai aprimorar seus conhecimentos sobre o desenvolvimento de software.
Vamos estudar com mais profundidade os aspectos da fase de projeto de sistemas.
O que vamos estudar neste curso resumidamente como estabelecer a colaborao entre os objetos de nosso sistema. Essa tarefa
que torna um sistema melhor do que outro do ponto de vista do
desempenho e da sua expanso e atualizao.
O que vamos estudar pode ser considerado como uma verdadeira
carga de experincia profissional.
Vamos examinar algumas questes prticas de projeto de sistemas que serviro como regras que voc poder aplicar em seus
futuros projetos.
Aproveite e faa todos os exerccios e participe das discusses
nos fruns.
No final deste documento voc conhecer a bibliografia recomendada para nossa disciplina.
Projeto de Sistemas
12
13
Reviso de UML
Ol,
Neste captulo vamos fazer uma reviso de alguns conceitos importantes de UML (Unified Modelling Language Linguagem
Unificada de Modelagem).
1.1. UML
UML (Unified Modelling Language Linguagem Unificada de Modelagem) uma linguagem de modelagem que utilizamos para criar modelos de sistemas.
Na maioria das vezes o diagrama de classes considerado o diagrama
mais importante, porm no devemos esquecer que ele apenas uma
representao esttica do sistema. Existem outros diagramas muito importantes que tambm demonstram a dinmica do sistema.
Uma das caractersticas mais importantes de UML que ela independente da linguagem de programao utilizada no projeto.
Outro fato importante que a UML uma linguagem padronizada pela
ISO (International Standard Organization) e capaz de modelar qualquer
tipo de problema, no s os problemas de Sistemas de Informao.
Projeto de Sistemas
14
Captulo 1
Diagrama de Classes
Reviso de UML
Diagrama de Objetos
um diagrama de instncias das classes mostradas no diagrama de classes. Mostra as instncias e como elas se relacionam entre si. Fornece
uma viso de casos reais (Figuras 3 e 4).
Diagrama de Componentes
Mostra a organizao dos componentes do sistema. Um componente corresponde a uma ou a vrias classes, interfaces ou colaboraes (Figura 5).
Projeto de Sistemas
15
16
Captulo 1
Diagrama de Deployment
Reviso de UML
Diagramas Dinmicos
Projeto de Sistemas
17
18
Captulo 1
Diagrama de Estado
Mostra os estados, eventos, transies e atividades dos objetos. So muito teis para o projeto de sistemas que reagem a eventos e tambm no
projeto da interface grfica com o usurio (GUI), conforme Figura 9.
Diagrama de Atividades
Mostra o fluxo de informaes entre objetos. til para modelar o funcionamento do sistema e o fluxo de controle entre objetos (Figura 10).
19
Reviso de UML
Casos
Classes Objetos
Sequncia
Colaborao
Estado
Atividades
Compo- Deployment
nentes
de Uso
Projeto
Processos
Implementao
Deployment
Projeto de Sistemas
X
X
20
Captulo 1
Casos
de
uso
Classes Objetos
Sequncia
Colaborao
Sistemas
Simples
Sistemas
Simples
com
entradas
de dados
complexas
Cliente /
Servidor
Sistemas
Web
Sistemas
Complexos
Estado
Atividades
Compo- Deployment
nentes
Reviso de UML
Projeto de Sistemas
21
22
Captulo 1
Reviso de UML
Projeto de Sistemas
23
24
Captulo 1
Cada classe deve ter um nico nome que a diferencia das outras classes.
Um atributo representa alguma propriedade da classe que se encontra em
todas as instncias da classe. Os atributos podem ser representados por
seu nome, seu nome e tipo ou ainda por seu nome, tipo e valor default.
Um mtodo ou operao a implementao de um servio da classe que mostra um comportamento comum a todos os objetos daquela classe. Resumindo:
uma funo que indica s instncias da classe que faam alguma coisa.
Reviso de UML
25
26
Captulo 1
Reviso de UML
Projeto de Sistemas
27
28
Captulo 1
29
Reviso de UML
Projeto de Sistemas
30
Captulo 1
31
Reviso de UML
componente
com
seu
esteretipo
32
Captulo 1
No exemplo mostrado na Figura 20, temos as relaes entre os diferentes arquivos de um sistema. Cada arquivo cpp utiliza seu arquivo .h
correspondente e meuServico.h utiliza NTService.h e stdio.h.
Reviso de UML
Como um componente pode residir em mais de um n, podemos utilizar o componente de forma independente, sem que pertena a nenhum
n especfico, e relacion-lo com os ns nos quais ele pode residir.
33
34
Captulo 1
cejada que indica sua vida no sistema. Essa linha simples se converte
em uma linha grossa quando representa que o objeto tem o foco do
sistema, isto , quando est ativo.
No diagrama da Figura 22 temos 3 objetos e um ator, situado esquerda, que quem inicia a ao. Como se pode ver, o objeto mais
direita aparece mais embaixo que os outros existentes, pois ele ser
criado por uma mensagem de criao. Observe tambm a mensagem
para a destruio do Objeto 3.
A mensagen4() uma mensagem para o mesmo objeto, isto , uma
mensagem para um mtodo interno.
Reviso de UML
LARMAN, Craig. Utilizando UML e padres: uma introduo anlise e ao projeto orientados a objetos e ao desenvolvimento iterativo. Trad. Rosana Vaccare Braga et al. 3ed. Porto
Alegre: Bookman, 2007.
Projeto de Sistemas
35
36
Captulo 1
37
O PROCESSO DE PROJETO
ORIENTADO A OBJETOS
Projeto de Sistemas
38
Captulo 2
Por exemplo: em um sistema para uma loja de eletrodomsticos, poderamos obter os conceitos Eletrodomsticos, Geladeira, Fogo, etc.
Mas observe que esta hierarquia pode ser considerada irrelevante para
o problema, que : vender, fazer pedidos, reservar, dar baixa nos eletrodomsticos, sem distino. Assim, o mais indicado trabalhar apenas
com o conceito Eletrodomsticos.
Projeto de Sistemas
39
40
Captulo 2
Projeto de Sistemas
41
42
Captulo 2
O artigo A Laboratory for Teaching Object-Oriented Thinking facilmente encontrado em vrios links na Internet. Vale a pena conhec-lo!
Colaboradores
Projeto de Sistemas
43
44
Captulo 2
Selecionado o cenrio, criamos um carto CRC para cada classe do cenrio e colocamos estes cartes CRC no centro da mesa de reunies.
Em seguida, percorremos os passos do cenrio procurando responder a
pergunta: de quem a responsabilidade deste passo?
Projeto de Sistemas
45
46
Captulo 2
Mensagem
Sistema de Correio
Gerenciar caixas postais
Fila de Mensagens
Gerenciar mensagens por meio de
uma fila FIFO
47
Conexo
Receber as entradas de telefone
Tratar os comandos
Manter o estado da conexo
Projeto de Sistemas
48
Captulo 2
6. Usurio desliga.
Telefone notifica Conexo.
Conexo
Conexo
Receber as entradas de telefone
Telefone
Tratar os comandos
Sistema de Correio
Caixa Postal
Mensagem
Caixa Postal
Mensagem
Gerenciar contedo de mensagens
Projeto de Sistemas
49
50
Captulo 2
11. ...
Aps a anlise desse caso de uso, vemos que o carto CRC Caixa Postal
sofreu algumas alteraes:
Caixa Postal
Gerenciar as mensagens novas e Fila de Mensagens
armazenadas
Gerenciar saudao
Gerenciar senha
Recuperar, salvar e eliminar
mensagens
Assim terminamos nossa anlise de dois casos de uso com a tcnica de CRC.
Obtivemos uma boa distribuio das responsabilidades.
Projeto de Sistemas
51
52
Captulo 2
2.10. Concluso
Neste captulo examinamos um processo de desenvolvimento de software muito simples e eficaz.
Com os diagramas de Classes e de Sequncia fica fcil e seguro partir
para a implementao em uma linguagem de programao.
Projeto de Sistemas
53
54
Captulo 2
FUNDAMENTOS DE PROJETO:
PADRES GRASP
Neste captulo, vamos revisar alguns princpios estudados na disciplina de Anlise e Projeto de Sistemas I que devemos seguir para
realizarmos um bom projeto.
3.1. Introduo
Neste captulo vamos examinar os Padres de Atribuio de Responsabilidades, propostos por Larman em seu livro Utilizando UML e Padres e alguns outros princpios de projeto importantes.
Nas prximas sees veremos alguns conselhos de Larman que podem
parecer bastante bvios e triviais; porm, a violao dessas regras simples que causa a maioria dos problemas nos projetos OO.
Projeto de Sistemas
55
56
Captulo 3
Low Coupling;
Controller.
A resposta a essa pergunta leva alocao inteligente dos comportamentos, o que por sua vez resulta em sistemas mais robustos e fceis de
entender, expandir e reutilizar.
3.3.1. Exemplo
Temos trs classes: uma representando Pedidos, outra LinhaPedido e
outra CatalogoDeProduto. Um trecho do modelo conceitual :
Projeto de Sistemas
57
58
Captulo 3
3.4.1. Exemplo
59
60
Captulo 3
3.5.1. Exemplo
No projeto de um sistema de controle de elevadores, a seguinte classe
foi projetada:
Nosso sistema de controle de elevador est tentando modelar no mnimo umas trs abstraes com uma nica classe: um Alarme, a Porta do
elevador e o registro de falhas.
Separando essas abstraes, teramos um projeto que podemos considerar melhor para o sistema de controle de elevadores:
O Alto Acoplamento leva a um projeto de difcil manuteno e modificao, isto porque uma simples mudana em uma classe pode ocasionar mudanas em vrias outras classes, visto que elas so muito
dependentes entre si.
O diagrama de colaborao fornece um excelente meio de verificar o
nvel de acoplamento do projeto. O diagrama de classes tambm d uma
idia do nvel de acoplamento.
Projeto de Sistemas
61
62
Captulo 3
O modelo conceitual uma excelente fonte de informaes sobre o que devemos considerar o mnimo. tolervel aumentar o nvel de acoplamento de
um projeto, depois de uma sria e profunda anlise sobre as consequncias.
Tecnologia em Anlise e Desenvolvimento de Sistemas
3.6.1. Exemplos
Em um sistema de Pedidos, identificamos no modelo conceitual que
Clientes possuem Pedidos.
No caso de uso Criar Pedidos que classe deve ser responsvel por criar
um novo Pedido?
O padro Creator sugere que a classe Cliente deve ser responsvel:
Com esde critrio acoplamos Cliente a Pedidos. Nesse caso, est OK,
pois, como voc pode ver (no modelo conceitual), eles so acoplados
no mundo real.
Em seguida, uma vez que Pedido foi criado, o caso de uso precisa adicionar Linha de Pedidos a Pedidos. Quem deve ser responsvel por adicionar as linhas de pedidos?
Uma soluo seria Cliente adicionar as linhas (afinal ele possui as informaes de inicializao necessrias: quantas linhas, que produtos, que
quantidades, etc).
Essa soluo aumentou o acoplamento artificialmente; temos agora todas as trs classes dependentes umas das outras.
Se fizermos Pedido responsvel pela criao das linhas de pedidos, faremos com que Cliente no tenha nenhum acoplamento com
LinhaPedidos.
Projeto de Sistemas
63
64
Captulo 3
Essa soluo pode parecer boa, mas na realidade ela viola o padro Expert!
Projeto de Sistemas
65
66
Captulo 3
No Padro Controller criamos uma nova classe que vai ficar entre
o usurio e as classes de negcio.
O padro Controller uma soluo possvel.
Uma sugesto para o nome desta classe :
<nomeDoCasoDeUSo>Handler.
Ento, em nosso projeto, precisamos criar uma classe
FazerApostasHandler
67
FUNDAMENTOS DE PROJETO:
HERANA X COMPOSIO
4.1. Introduo
Neste captulo vamos examinar como devemos utilizar os mecanismos
de herana e composio em nossos projetos de forma eficiente e eficaz.
Para estender um objeto temos dois mecanismos bsicos:
Herana
Composio
Os desenvolvedores iniciantes acreditam erradamente que o mecanismo de herana mais importante e costumam deixar de lado a composio em seus projetos.
Para projetos bem sucedidos, siga a seguinte regra:
use Composio para estender responsabilidades de um objeto delegando trabalho para outros objetos; e
use Herana para estender atributos e mtodos.
4.2. Composio
Neste exemplo um objeto Passageiro uma composio de algum nmero de objetos Reserva.
Uma composio ocorre sempre que voc encontrar uma restrio de
conexo de objetos que seja diferente de 1:1.
Projeto de Sistemas
68
Captulo 4
4.3. Herana
O mecanismo de herana estende a implementao de um mtodo, no
apenas a sua interface.
Em seguida, precisamos criar uma classe chamada Agente, para os agentes de viagens.
Projeto de Sistemas
69
70
Captulo 4
Projeto de Sistemas
71
72
Captulo 4
Queremos ento incluir uma classe Sensor Remoto, que deve ser solicitada para que fornea uma leitura de seus dados. Esse tipo de sensor no
pode ser ativado e monitorado pelo Temporizador.
Projeto de Sistemas
73
74
Captulo 4
[1]
LARMAN, Craig. Utilizando UML e padres: uma introduo anlise e ao projeto orientados a objetos e ao desenvolvimento iterativo. Trad. Rosana Vaccare Braga et al. 3ed. Porto
Alegre: Bookman, 2207.
Projeto de Sistemas
75
76
Captulo 4
77
FUNDAMENTOS DE PROJETO:
INTERFACES
Neste captulo vamos estudar quais as vantagens do uso de interfaces e como aplic-las em nossos projetos.
Ao criar uma Interface, utilize a seguinte regra para o nome da interface: inicie o nome com o prefixo I, seguido por:
um substantivo, quando for uma interface de acesso;
um verbo, quando for uma interface de clculo;
um substantivo com um verbo, quando for uma combinao de interfaces.
Projeto de Sistemas
78
Captulo 5
A interao entre dois objetos acopla esses dois objetos, tornando difcil
ou trabalhosa a alterao dos sistemas.
O uso de interfaces permite tornar mais flexvel, mais fcil de estender e
mais fcil a conexo entre os objetos de nosso sistema.
Quando precisamos de flexibilidade, podemos especificar as conexes
do objeto e o envio de mensagens para objetos em todas as classes que
implementam uma interface.
As interfaces tambm tornam mais fraco o acoplamento.
Podemos usar Interfaces para expressar a generalizao-especializao de
assinaturas de mtodos isto , comportamentos. Podemos usar um mecanismo de herana para expressar as relaes de generalizao-especializao de interfaces implementadas. As interfaces fornecem uma maneira de
separar assinaturas de mtodos das implementaes dos mtodos.
Enfim, as interfaces nos proporcionam uma maneira de estabelecer conexes entre objetos e o envio de mensagens a objetos em qualquer classe
que implemente uma interface necessria, sem conectar fisicamente os
objetos ou os envios de mensagens a uma classe especfica de objetos.
Estratgia 1
Questione cada conexo de objetos.
Essa conexo est conectada fisicamente apenas aos objetos nessa classe (mais simples), ou essa uma conexo a algum objeto
que implementa uma determinada interface (mais flexvel, extensvel ou plugvel)?
Estratgia 2
Questione cada envio de mensagem.
Esse envio de mensagem est conectado fisicamente apenas aos
objetos nessa classe (mais simples), ou um envio de mensagem
para qualquer objeto que implementa uma determinada interface
(mais flexvel, extensvel ou plugvel)?
Projeto de Sistemas
79
80
Captulo 5
a) Exemplo
Se temos em uma classe A um mtodo calculaTotal() e em uma classe B um mtodo calculaTotal, criamos uma interface ITotal com um
mtodo calculaTotal() e fazemos com que a classe A e a classe B
implementem ITotal.
Se temos em uma classe A um mtodo calculaTotal() e em uma classe C um mtodo determinaTotal() e ambas possuem o mesmo comportamento, ento separamos os componentes dessa assinatura de
mtodos para uma interface ITotal e fazemos com que as classes A
e C implementem ITotal.
Se temos uma classe A com um mtodo calculaTotal(), uma classe D
com um mtodo calculaSubTotal() e uma classe E com um mtodo
calculaTotalGeral(), escolhemos um sinnimo comum: calculaTotal. Separamos os componentes dessa assinatura de mtodo para a
interface ITotal. Fazemos com que as classes A, D e E implementem
a interface ITotal
Tecnologia em Anlise e Desenvolvimento de Sistemas
b) Outro Exemplo
Veja o diagrama de classes a seguir.
81
82
Captulo 5
}
public Venda extends Object implements IVenda
{
}
public float calculaImpostos()
{
}
public Loja extends Object implements ITotal, IQuantos
{
}
public int quantos()
{
}
public Item extends Object implements IQuantos
{
}
}
Projeto de Sistemas
83
84
Captulo 5
Sempre que um objeto tem uma e somente uma conexo com outro
objeto, ento esse objeto pode atuar como um agente para o outro.
Passageiro tem uma e somente uma conexo com o objeto Pessoa, ento Passageiro pode atuar como um agente (Proxy) para Pessoa.
Um agente faz perguntas em nome de um outro e proporciona uma
interface conveniente.
Exemplo
Veja o diagrama abaixo: o objeto Reserva solicita ao objeto Passageiro um
passageiro e em seguida solicita ao objeto Pessoa o endereo do Passageiro:
85
86
Captulo 5
Projeto de Sistemas
87
88
Captulo 5
Outra possibilidade muito interessante a criao de uma interface IUDadosPessoais, que um objeto de interface com o usurio, e contm
objetos de interface com o usurio (IU) menores, tais como botes, caixas de texto, etc. Essa interface tambm conhece alguns dos objetos nas
classes que implementam IDadosPessoais.
Como IDadosPessoais no est fisicamente conectada a objetos de apenas uma classe, ela trabalha com objetos de todas as classes que implementem a interface IDadosPessoais.
Projeto de Sistemas
89
90
Captulo 5
a) Exemplo
Nosso projeto realiza a venda ou o aluguel de um produto.
Podemos criar uma interface IVenda e outra IAluguel para nosso objeto Coisa.
Observe que qualquer aplicao pode interagir com um objeto em qualquer classe que implemente IReservaData.
Projeto de Sistemas
91
92
Captulo 5
Por exemplo: poderamos utilizar IUReservaData e IReservaData para aplicaes que requeiram fazer reservas (bibliotecas, locadoras, hotis, etc).
5.3.4. Para Fatorar para Expanso Futura
A estratgia que utilizamos :
Fatore as assinaturas de mtodos de forma que objetos de classes diferentes possam ser facilmente aceitos no futuro.
Razes para uso: permitir a flexibilidade de mudanas.
Uma dvida permanente a todo projeto : Com que outros objetos teremos que lidar no futuro?
Uma soluo para essa dvida adicionar interfaces a fim de se melhorar a compreenso do modelo e de se permitir a flexibilidade de mudanas no futuro.
Exemplo
Um sistema possui Sensores em Zonas diferentes.
Um diagrama de classes parcial mostrado a seguir:
93
94
Captulo 5
}
public void desativar()
{
}
}
public class Zona extends Object implements IAtivarGrupo
{
[1]
LARMAN, Craig. Utilizando UML e padres: uma introduo anlise e ao projeto orientados a objetos e ao desenvolvimento iterativo. Trad. Rosana Vaccare Braga et al. 3ed. Porto
Alegre: Bookman, 2207.
Projeto de Sistemas
95
96
Captulo 5
97
PADRO STRATEGY
6.2. Problema
Como permitir que a seleo de um algoritmo possa variar por objeto e
durante a execuo?
6.2.1. Na Anlise:
Quando existem diferentes implementaes de uma regra de negcio.
6.2.2. No Projeto:
Quando uma regra de negcio ou algoritmo muda de acordo com
um contexto.
6.2.3. Ateno
Quando uma estrutura de seleo mltipla (switch) determina que regra de negcio utilizar.
Quando existe uma hierarquia de classes e a diferena entre elas somente um mtodo que sobrescrito.
Projeto de Sistemas
98
Captulo 6
6.3. Soluo
Faa com que a classe que contm o algoritmo contenha uma classe
abstrata que tem um mtodo abstrato especificando como chamar o algoritmo. Cada classe derivada implementa o algoritmo desejado.
6.5. Observaes
Podemos utilizar o Strategy:
Quando classes relacionadas forem diferentes apenas no seu
comportamento;
Quando precisamos de diferentes variaes de um mesmo algoritmo;
Quando um algoritmo deve utilizar dados que um cliente no
deve conhecer;
Quando uma classe define muitos comportamentos que aparecem com mltiplas declaraes condicionais em suas operaes.
Padro Strategy
6.6. Implementao
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
interface SocketPool
{ Socket allocate( String host, int port )
void release ( Socket s )
}
class SimplePool implements SocketPool
{ public Socket allocate(String host,int port)
{ return new Socket(host, port);
}
public void release(Socket s)
{ s.close();
}
};
class KeepalivePool implements SocketPool
{ private Map connections = new HashMap();
public Socket allocate(String host,int port)
{ Socket connection =
(Socket)connections.get(host+:+port);
if(connection == null)
connection = new Socket(host,port);
return connection;
}
public void release(Socket s)
{ String host = s.getInetAddress().getHostName();
connections.put( host+:+s.getPort(),s );
}
//...
}
class ProtocolHandler
{ SocketPool pool = new SimplePool();
public void process( String host, int port )
{ Socket in = pool.allocate(host,port);
//...
pool.release(in);
}
public void setPoolingStrategy( SocketPool p)
{ pool = p;
}
}
Projeto de Sistemas
99
100
Captulo 6
6.7. Exerccios
1. O que acontece quando um sistema tem uma exploso de objetos
Strategy? Existe alguma forma melhor de gerenciar estas estratgias?
2. Existem duas formas de implementao do padro Strategy. Uma
forma descreve como um objeto estratgia pode ser passado como
uma referncia ao objeto contexto, permitindo o acesso aos dados
do contexto. Mas possvel que o dado requerido pelo Strategy no
esteja disponvel na interface de contexto? Como podemos remediar este problema potencial?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p. 292
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 217
Funes
PADRO OBSERVER OU
PUBLISH/SUBSCRIBE
7.2. Problema
Como estabelecer uma dependncia entre objetos de modo que, quando um objeto mudar seu estado interno, seus objetos dependentes sejam informados?
7.2.1. Na Anlise
Quando diferentes objetos precisam saber quando um evento ocorre.
E o nmero destes objetos pode variar com o tempo ou com o caso.
7.2.2. No Projeto
Quando diferentes objetos precisam saber quando um evento ocorre.
E o nmero destes objetos pode variar com o tempo ou com o caso.
7.2.3. Ateno:
Quando um novo objeto precisa ser notificado de um evento e o programador precisa modificar o cdigo do objeto que detecta o evento.
Projeto de Sistemas
101
102
Captulo 7
7.3. Soluo
Temos objetos (observadores) que querem saber quando um evento
ocorre, conectamos a outro objeto (observado), que est na realidade
esperando por sua ocorrncia. Quando um evento ocorre, o observado
informa aos observadores que ele ocorreu. O padro Adapter algumas
vezes necessrio para ser capaz de implementar a interface de Observer para todos os tipos de objetos.
7.5. Observaes
Vantagens:
Tanto os observadores quando os observados podem ser reutilizados e ter a sua interface e implementao alteradas sem
afetar o sistema.
Tecnologia em Anlise e Desenvolvimento de Sistemas
O acoplamento forte implicado pelo relacionamento bidirecional reduzido com o uso de interfaces e classes abstratas.
Desvantagens:
O abuso pode causar srio impacto na performance. Sistemas em que todos notificam todos a cada mudana ficam
inundados de requisies, esse efeito chamado de tempestade de eventos.
7.6. Implementao
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
103
104
Captulo 7
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
}
}
public boolean add(Object o)
{ notify(true,o); return c.add(o); }
public boolean remove(Object o)
{ notify(false,o); return c.remove(o); }
public boolean addAll(Collection items)
{ Iterator i = items.iterator()
while( i.hasNext() )
notify( true, i.next() );
return c.addAll(items);
}
// pass-through implementations of other
// Collection methods go here...
}
7.7. Exerccios
1. Quais so as propriedades de um sistema que usa o padro Observer extensivamente? Como podemos abordar a tarefa de depurao de um sistema desse tipo?
2. Est claro para voc como tratar problemas de concorrncia com esse padro? Considere uma mensagem Unregister()
sendo enviada a um Observado, justamente antes que o observado envie uma mensagem Notify() para o MudaGerenciador
(ou Controller).
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p. 274
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 95
Funes
PADRO DECORATOR
8.2. Problema
Como estender as funcionalidades de uma nica instncia de uma classe, sem afetar as outras instncias?
8.2.1. Na Anlise:
Quando existe alguma ao que sempre deve ser realizada e algumas
outras aes que podem ser realizadas.
8.2.2. No Projeto:
Quando existe um conjunto de aes e essas aes podem ser adicionadas em qualquer combinao a um mtodo existente. No desejamos
alterar o cdigo que utiliza a funo decorada.
8.2.3. Ateno:
Quando uma estrutura de seleo mltipla (switch) determina se alguma
funo opcional deve ser chamada antes de alguma funo existente.
Projeto de Sistemas
105
106
Captulo 8
8.3. Soluo
Configure uma classe abstrata que representa tanto a classe original
quanto as novas funes a serem adicionadas. Faa cada uma conter
um tratador para um objeto deste tipo (na realidade, um tipo derivado).
Em nossos decoradores, execute a funo adicional e ento chame o
mtodo operao() do objeto contido. Opcionalmente chame o mtodo
operao() do objeto contido primeiro e ento execute as suas prprias
funes especiais.
8.5. Observaes
Padro Decorator
8.6. Implementao
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import java.util.*;
/* I would prefer for this class to be a LinkedList,
* but LinkedList is not an interface, and
* useful methods like addFirst() and removeFirst()
* are not defined in an interface.
*/
public class BlockingList implements List
{ private final List component;
public BlockingList( List component )
{ this.component = component;
}
private boolean noLongerEmpty()
{ try
{ while( component.size() == 0 )
wait();
return true;
}
catch( InterruptedException e )
{ return false;
}
}
synchronized public boolean add(Object o)
{ boolean toReturn = component.add(o);
notifyAll();
return toReturn;
}
synchronized public boolean remove(Object o)
{ if( noLongerEmpty() )
return component.remove(o);
return false;
}
public int size()
{ return component.size();
}
Projeto de Sistemas
107
108
Captulo 8
8.7. Exerccios
1. Na implementao do padro Decorator, a interface de um objeto decorator deve ser idntica interface do componente que ele
decora. Considere um objeto A, que decorado com um objeto B.
Como B decora o objeto A, o objeto B compartilha uma interface
com o objeto A. Se a algum cliente ento passada uma instncia
desse objeto decorado, e esse mtodo tenta chamar um mtodo
em B que no faz parte da interface de A, isso significa que o objeto no mais um Decorator, no senso estrito do padro? Alm
disso, por que importante que a interface de um objeto decorador seja idntica interface do componente que ele decora?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p. 170.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 259.
Funes
9.2. Problema
Como permitir que subclasses decidam que classe instanciar?
9.2.1. Na Anlise:
Quando existem objetos semelhantes cujas implementaes so coordenadas entre elas.
9.2.2. No Projeto:
Uma classe precisa instanciar uma derivao de outra classe, mas no
sabe qual.
FactoryMethod permite que uma classe derivada tome essa deciso.
9.3. Soluo
Tenha um mtodo na classe abstrata que abstrato (virtual puro). O
cdigo da classe abstrata ir referenciar esse mtodo quando precisar
instanciar um objeto contido. Observe, entretanto, que o cdigo no
Projeto de Sistemas
109
110
Captulo 9
sabe qual dos mtodos ele precisa. Isso ocorre porque todas as classes
derivadas dessa devem implementar esse mtodo com comandos new
apropriados para instanciar o objeto correto.
9.5. Implementao
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
9.6. Exerccios
1. Explique como o Factory Method promove o baixo acoplamento.
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph; VLISSIDES, John. Padres de projeto: solues reutilizveis de software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto
Alegre: Bookman, 2000. p. 112.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 155.
Projeto de Sistemas
111
112
Captulo 9
Funes
PADRO SINGLETON
Neste captulo vamos garantir que uma classe s tenha uma nica instncia, e vamos prover um ponto de acesso global a ela.
10.2. Problema
Como garantir que somente uma nica instncia de uma classe vai ser
criada?
10.2.1. Na Anlise:
Quando existe uma nica instncia de algum objeto no domnio do
problema que utilizada em lugares diferentes.
10.2.2. No Projeto:
Quando vrios objetos clientes precisam referenciar o mesmo objeto
servidor e queremos ter certeza de que no teremos mais de uma instncia do objeto servidor.
Quando queremos uma nica instncia de um objeto, mas no existe
nenhum objeto superior controlando a instanciao dele.
10.3. Soluo
Adicione um membro esttico classe que referencia a primeira instanciao desse objeto (inicialmente ele nulo). Ento, adicione um mtodo esttico que instancia essa classe se esse membro nulo (e atribua
Projeto de Sistemas
113
114
Captulo 10
o valor do membro a ele) e ento retorne o valor desse membro. Finalmente, faa o construtor protegido ou privado, de modo que ningum
possa instanciar diretamente essa classe e pular esse mecanismo.
10.5. Implementao
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
Class Singleton1
{ private static Singleton instance;
private Singleton1()
{ Runtime.getRuntime().addShutdownHook
( new Thread()
{ public void run()
{ /* clean-up code here */
}
}
);
}
public static synchronized Singleton instance()
{ if( instance == null )
instance = new Singleton();
return instance;
}
}
class Singleton2
{ private static final Singleton instance =
new Singleton2();
Padro Singleton
172
173
174
175
176
177
178
179
180
181
182
183
184
10.6. Exerccios
1. O padro Singleton frequentemente utilizado com o padro
Abstract Factory. Que outro padro (criacional ou no) podemos
usar com o padro Singleton?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph; VLISSIDES, John. Padres de projeto: solues reutilizveis de software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto
Alegre: Bookman, 2000. p. 130.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 89.
Projeto de Sistemas
115
116
Captulo 10
Funes
PADRO COMMAND
11.2. Problema
Como permitir operaes sobre comandos, tais como sequenciamento e desfazer?
117
118
Captulo 11
11.4. Implementao
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
Padro Command
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
{ Action action =
(Action) redoStack.removeFirst();
action.doIt();
undoStack.addFirst( action );
}
private interface Action
{ void doIt ();
void undoIt();
}
private class InsertAction implements Action
{ Cursor where = (Cursor) current.clone();
char inserted;
public InsertAction(char newCharacter)
{ inserted = newCharacter;
}
public void doIt()
{ current.moveTo( where );
current.
insertCharacterAt(inserted);
current.moveRight();
}
public void undoIt()
{ current.moveTo( where );
current.deleteCharacterAt();
}
}
private class DeleteAction implements Action
{ Cursor where = (Cursor) current.clone();
char deleted;
public void doIt()
{ current.moveTo( where );
deleted = current.characterAt();
current.deleteCharacterAt();
}
public void undoIt()
{ current.moveTo( where );
current.insertCharacterAt( deleted);
current.moveRight();
}
}
//...
}
Projeto de Sistemas
119
120
Captulo 11
11.5. Exerccios
1. Uma utilizao muito comum do padro Command em Menus. Uma aplicao possui um menu, que por sua vez possui Itens
de menu, que executam comandos quando so clicados. O que
acontece se o comando precisa de alguma informao sobre a
aplicao para executar a sua tarefa? Como deve o comando ter
acesso a essa informao de modo que novos comandos possam
ser facilmente escritos e que possuam acesso informao de que
eles necessitam?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p. 222.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 227.
Funes
PADRO ADAPTER
12.2. Problema
O que fazer quando um objeto Cliente deseja um servio de outro objeto Servidor por meio de uma interface, mas o objeto Servidor no
implementa a interface?
12.2.1. Na Anlise:
Normalmente no nos preocupamos com interfaces na Anlise. Entretanto, se voc sabe que vai utilizar algum cdigo pr-existente em seu
projeto, pode ser necessrio utilizar um Adapter para esse cdigo.
12.2.2. No Projeto:
Quando algum objeto tem mtodos adequados, mas uma interface inadequada.
usado quando temos que realizar alguma operao em um objeto cuja
interface no pode ou no deve ser alterada.
12.3. Soluo
Contm a classe existente em outra classe. Fazer com que a classe
contida possua a mesma interface e chame os mtodos contidos na
classe adaptada.
Projeto de Sistemas
121
122
Captulo 12
12.5. Implementao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Padro Adapter
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
}
}
public void remove()
{ throw new UnsupportedOperationException();
}
}
class WrappedObjectIterator implements Iterator
{ private boolean atEndOfFile = false;
private final ObjectInputStream in;
public
WrappedObjectIterator(ObjectInputStream in)
{ this.in = in;
}
public boolean hasNext()
{ return atEndOfFile == false;
}
public Object next()
{ try
{ return in.readObject();
}
catch(Exception e){/* as above */}
}
public void remove()
{ throw new UnsupportedOperationException();
}
}
12.6. Exerccios
1. Faz sentido criar um Adapter que possui a mesma interface que
o objeto que ele adapta? Seu Adapter no seria um Proxy?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph; VLISSIDES, John. Padres de projeto: solues reutilizveis de software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto
Alegre: Bookman, 2000. p. 140.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 35.
Projeto de Sistemas
123
124
Captulo 12
Funes
PADRO FAADE
O padro Faade oferece uma interface nica de nvel mais elevado para um conjunto de interfaces de um subsistema.
13.2. Problema
Como acessar um conjunto de objetos por meio de uma nica interface ou objeto?
13.2.1. Na Anlise:
Quando somente algumas funes de um sistema complexo vo
ser utilizadas.
13.2.2. No Projeto:
Quando a referncia a um sistema j existente feita de forma semelhante.
Ento, vemos combinaes de chamadas ao sistema sendo repetidas
vrias vezes.
13.2.3. Ateno:
Quando os desenvolvedores precisam estudar a interface de um
novo sistema, porm cada um deles s vai utilizar uma pequena
parte da interface.
Projeto de Sistemas
125
126
Captulo 13
13.3. Soluo
Defina uma nova classe (ou classes) que possui (em) a interface desejada. Faa com que essa(s) classe(s) utilize(m) o sistema existente.
13.5. Implementao
1
2
3
4
5
6
7
8
9
10
class XMLStorage
{ public store(URL out, Object toStore)
{ /* Code goes here that uses the
* introspection APIs in the System
* class to get the class name and the
* values of all the public fields in
* the class. The name and the values of
* those fields are then used to build a
* JDOM tree, which is passed to an
* outputter to send an XML
Tecnologia em Anlise e Desenvolvimento de Sistemas
Padro Faade
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
13.6. Exerccios
1. Quo complexo deve ser um sistema que justifique o uso do
padro Faade?
2. Que outras formas de utilizar o padro Faade podemos imaginar com relao a um grupo de desenvolvedores e projetistas
com diferentes habilidades e conhecimento? Quais as ramificaes polticas?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph; VLISSIDES, John. Padres de projeto: solues reutilizveis de software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto
Alegre: Bookman, 2000. p. 179
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 49
Projeto de Sistemas
127
128
Captulo 13
Funes
Neste captulo vamos definir o esqueleto de um algoritmo dentro de uma operao, deixando alguns passos a serem preenchidos pelas subclasses.
14.2. Problema
Como permitir que subclasses de uma classe variem partes ou passos de
um algoritmo geral?
14.2.1. Na Anlise:
Quando existem diferentes procedimentos que devem ser seguidos e
que so essencialmente o mesmo, exceto em detalhes em que cada passo
faz coisas diferenciadas.
14.2.2. No Projeto:
Voc tem um conjunto de passos consistentes a seguir, mas alguns passos individuais podem ter implementaes diferentes.
14.2.3. Ateno:
Quando classes diferentes implementam essencialmente o mesmo
fluxo de processo.
Projeto de Sistemas
129
130
Captulo 14
14.3. Soluo
Crie uma classe abstrata que implementa um procedimento usando mtodos abstratos. Esses mtodos devem ser implementados nas classes
derivadas, para executar cada passo do procedimento. Se os passos variam independentemente, cada passo pode ser implementado com um
padro Strategy.
14.5. Implementao
27
28
29
30
31
32
class ProtocolHhandler2
{ protected Socket allocate(String host,int port)
{ return new Socket(host, port);
}
protected void release(Socket s)
{ s.close();
Tecnologia em Anlise e Desenvolvimento de Sistemas
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
60
}
public void process( String host, int port )
{ Socket in =
socketPool.allocate(host,port);
//...
socketPool.release(in);
}
}
class KeepaliveProtocolHandler
{
private Map connections = new HashMap();
public Socket allocate(String host,int port)
{ Socket connection =
(Socket)connections.get(host+:+port);
if(connection == null)
connection = new Socket(host,port);
return connection;
}
public void release(Socket s)
{ String host=
s.getInetAddress().getHostName();
connections.put( host+:+s.getPort(),s);
}
}
14.6. Exerccios
1. O Template Method utiliza herana. Seria possvel obter a mesma funcionalidade de um Template Method, utilizando a composio? Quais seriam as desvantagens?
Projeto de Sistemas
131
132
Captulo 14
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p. 301.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 197.
Funes
PADRO ITERATOR
Este padro promove uma maneira de acessar elementos de um objeto agregado sequencialmente, sem expor sua representao interna.
15.2. Problema
Como acessar sequencialmente todos os objetos de uma coleo, sem
expor a interface ou a forma de representao da coleo.
15.2.1. Na Anlise:
Quando temos uma coleo de objetos, mas no est claro qual o tipo
certo de coleo de objetos que devemos utilizar.
15.2.2. No Projeto:
Quando desejamos esconder a estrutura interna de uma coleo e precisamos de uma forma de percorrer uma coleo independente de sua
armazenagem interna.
15.2.3. Ateno:
Quando uma mudana na estrutura de interna de uma coleo implica
a mudana da forma de como a coleo iterada.
15.3. Soluo
Defina uma classe abstrata para ambas as colees e iteradores. Faa
cada coleo derivada incluir um mtodo que instancia o iterador ade
Projeto de Sistemas
133
134
Captulo 15
15.5. Implementao
1
2
3
4
5
6
7
8
9
10
11
12
13
Padro Iterator
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
15.6. Exerccios
1. Considere um Composite que contm objetos Emprstimo. A
interface do objeto Emprstimo contm um mtodo chamado
Projeto de Sistemas
135
136
Captulo 15
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p. 244.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 277.
Funes
PADRO COMPOSITE
16.2. Problema
Como criar um objeto estruturado definido recursivamente em termos
de outros objetos?
16.2.1. Na Anlise:
Quando existem objetos simples e grupos de objetos que precisam ser
tratados da mesma maneira.
O grupo de objetos composto de outros grupos e objetos simples, isto
, eles so hierarquicamente relacionados.
16.2.2. No Projeto:
Alguns objetos so compostos de colees de outros objetos, e queremos tratar esses objetos de uma forma unificada.
16.2.3. Ateno:
Quando o tratamento entre um objeto e sua coleo feito por cdigos diferentes.
Projeto de Sistemas
137
138
Captulo 16
16.3. Soluo
Crie uma classe abstrata que representa todos os elementos na hierarquia. Defina no mnimo uma classe derivada que representa as componentes individuais. Ainda defina no mnimo uma outra classe que representa os elementos compostos (isto , aqueles elementos que contm
componentes mltiplos). Na classe abstrata, defina mtodos abstratos
que os objetos clientes usaro. Finalmente, implemente esses mtodos
para cada uma das classes derivadas.
Padro Composite
16.5. Implementao
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
Projeto de Sistemas
139
140
Captulo 16
16.6. Exerccios
1. Como o padro Composite ajuda a consolidar uma lgica condicional no sistema como um todo?
2. Podemos usar o padro Composite mesmo no tendo uma hierarquia parte-todo? Em outras palavras, se somente uns poucos
objetos possuem filhos e quase todos os outros elementos de sua
coleo so folhas (uma folha no pode ter filhos!), ainda assim
devemos usar o padro Composite para modelar esses objetos?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p.160.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 61.
Funes
PADRO STATE
17.2. Problema
Como permitir que um objeto dinamicamente mude um conjunto de
atributos?
Como mudar a natureza (ao invs dos valores) de um estado do
objeto?
17.2.1 Na Anlise:
Quando temos comportamentos que mudam dependendo do estado
em que est o objeto.
17.2.2. No Projeto:
Quando temos comportamentos que mudam dependendo do estado
em que est o objeto.
17.2.3. Ateno:
Quando o cdigo tem que lembrar do estado do sistema.
Cada vez que um evento tratado, um comando de seleo mltipla
(switch) determina que cdigo deve ser executado.
Projeto de Sistemas
141
142
Captulo 17
17.3. Soluo
Defina uma classe abstrata para representar o estado de uma aplicao.
Derive uma classe para cada estado possvel. Cada uma dessas classes
pode agora operar independentemente de outra. As transies de estado podem ser tratadas tanto na classe contextual quanto nos prprios
estados. As informaes que so persistentes entre os estados devem
ser armazenadas no contexto. Os estados devem precisar acessar essas
informaes por meio de mtodos get.
17.5. Implementao
1
2
3
4
5
Padro State
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
143
144
Captulo 17
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
17.6. Exerccios
1. Se um objeto possui somente dois ou trs estados, vale a pena
usar o padro State?
[1]
GAMMA, Erich; HELM, Richard; JOHSON, Ralph;
VLISSIDES, John. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000. p. 284.
[2]
METSKER, Steven John. Padres de projetos em Java.
Porto Alegre: Bookman, 2004. p. 207.
Funes
PADRO PROXY
18.2. Problema
Como acessar um servio de modo transparente, permitindo acesso fcil a objetos complexos ou que no esto instanciados durante a execuo da chamada?
18.2.1. Na Anlise:
1. Problemas de Performance (velocidade ou memria) podem
ocorrer devido ao custo em manter um objeto na memria antes
de ele ser utilizado.
2. Precisamos que alguma ao ocorra antes que um objeto j
existente seja chamado.
3. Um objeto precisa acessar um objeto remoto, e no queremos
nos preocupar com a conexo.
18.2.2. No Projeto:
1. Problemas de Performance (velocidade ou memria) podem
ocorrer devido ao custo em manter um objeto na memria antes
de ele ser utilizado.
2. Precisamos que alguma ao ocorra antes que um objeto j
existente seja chamado.
3. Um objeto precisa acessar um objeto remoto, e no queremos
nos preocupar com a conexo.
Projeto de Sistemas
145
146
Captulo 18
18.2.3. Ateno:
Quando objetos so instanciados antes de serem utilizados e causam
problemas de performance.
Quando precedemos uma funo com o mesmo cdigo cada vez que
utilizada, ou quando adicionamos uma estutura de seleo mltipla
(switch) a um objeto de modo que em algumas vezes ele faa um prprocessamento e em outras no.
Quando o uso de um objeto e de seu acesso encontrado em vrios
lugares do cdigo.
18.3. Soluo
Proxy Virtual: O cliente referencia o objeto proxy em vez do objeto original. O objeto proxy armazena as informaes necessrias para instanciar a classe original, porm adia a sua instanciao. Quando o objeto
da classe original realmente necessrio, o proxy o instancia e faz as
operaes necessrias.
Padro Proxy
18.5. Implementao
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
class Employee
{ private long id;
private Money wage; // hourly wage
private Timesheet hoursWorked;
public Employee(long id)
{ this.id = id;
hoursWorked = Timesheet.create(id);
wage
= Database.getHourlyWage(id);
}
void printPaycheck()
{ Money weeklyWage =
hoursWorked.computeSalary(wage);
//...
}
}
abstract class Timesheet
{ //...
public static Timesheet create(long id)
{ return ( dataAlreadyInMemory )
? new Real(id)
: new Proxy(id);
}
public abstract Money computeSalary(Money wage);
//---------------------------------------private static class Proxy extends Timesheet
{ Timesheet realTimesheet = null;
long id;
Proxy(long id){this.id = id;}
public Money computeSalary(Money wage)
{ if( realTimesheet == null )
realTimesheet = new Real(id);
return realTimesheet.
computeSalary(wage);
}
}
//---------------------------------------private static class Real extends Timesheet
{ Real(long employeeId)
Projeto de Sistemas
147
148
Captulo 18
108
109
110
111
112
113
114
115
18.6. Exerccios
1. Se um Proxy utilizado para instanciar um objeto somente quando ele
absolutamente necessrio, o Proxy simplifica o cdigo?
[1] GAMMA, Erich; HELM, Richard; JOHSON, Ralph; VLISSIDES, John. Padres de projeto: solues reutilizveis de software
orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre:
Bookman, 2000. p. 198.
[2] [METSKER, Steven John. Padres de projetos em Java. Porto
Alegre: Bookman, 2004. p. 115.
Funes
LARMAN, Craig. Utilizando UML e padres: uma introduo anlise e ao projeto orientados a objetos e ao desenvolvimento iterativo.
Trad. Rosana Vaccare Braga et al. 3ed. Porto Alegre: Bookman, 2207.
GAMMA, Erich et alii.. Padres de projeto: solues reutilizveis de
software orientado a objetos. Trad. Luiz A. Meirelles Salgado. Porto Alegre: Bookman, 2000.
McCONNEL, Steve. Code complete: guia prtico para a construo de
software. 2ed. Porto Alegre: Bookman, 2005.
METSKER, Steven John. Padres de projetos em Java. Porto Alegre:
Bookman, 2004.
http://www.cix.co.uk/~smallmemory/almanac/
Projeto de Sistemas
149