O documento apresenta padrões de projeto, divididos em três partes: padrões estruturais, comportamentais e criacionais. Os padrões de projeto são soluções reutilizáveis para problemas comuns na programação, prevenindo a reinvenção da roda e promovendo melhor comunicação entre desenvolvedores.
1. Padr˜es de Projeto
o
Humberto C Marchezi
22 de junho de 2012
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 1 / 42
2. Conte´do
u
1 Conte´do
u
2 Apresenta¸˜o
ca
3 Padr˜es de Projeto Estruturais
o
4 Padr˜es de Projeto Comportamentais
o
5 Padr˜es de Projeto Criacionais
o
6 Padr˜es de Projeto de Sistemas Empresariais
o
7 Referˆncias
e
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 2 / 42
3. Apresenta¸˜o
ca
Padr˜es de Projeto
o
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 3 / 42
4. Apresenta¸˜o
ca
Padr˜es de Projeto
o
Solu¸˜o reutiliz´vel para um problema que ocorre de tempos em
ca a
tempos
// Como eu f a ¸ o p a r a i s o l a r a t e c n o l o g i a X P T O do meu s i s t e m a ??
c
MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;
...
t h i s . mapa . S e l e c i o n a r L o t e ( c o d L o t e ) ;
...
t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;
...
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 3 / 42
5. Apresenta¸˜o
ca
Padr˜es de Projeto
o
Solu¸˜o reutiliz´vel para um problema que ocorre de tempos em
ca a
tempos
// Como eu f a ¸ o p a r a i s o l a r a t e c n o l o g i a X P T O do meu s i s t e m a ??
c
MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;
...
t h i s . mapa . S e l e c i o n a r L o t e ( c o d L o t e ) ;
...
t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;
...
Os padr˜es de projeto s˜o id´ias provadas e testadas, prevenindo a
o a e
reinven¸˜o da roda
ca
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 3 / 42
6. Apresenta¸˜o
ca
Padr˜es de Projeto
o
Solu¸˜o reutiliz´vel para um problema que ocorre de tempos em
ca a
tempos
// Como eu f a ¸ o p a r a i s o l a r a t e c n o l o g i a X P T O do meu s i s t e m a ??
c
MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;
...
t h i s . mapa . S e l e c i o n a r L o t e ( c o d L o t e ) ;
...
t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;
...
Os padr˜es de projeto s˜o id´ias provadas e testadas, prevenindo a
o a e
reinven¸˜o da roda
ca
Promovem a melhoria da comunica¸˜o entre desenvolvedores
ca
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 3 / 42
7. Apresenta¸˜o
ca
Padr˜es de Projeto
o
Solu¸˜o reutiliz´vel para um problema que ocorre de tempos em
ca a
tempos
// Como eu f a ¸ o p a r a i s o l a r a t e c n o l o g i a X P T O do meu s i s t e m a ??
c
MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;
...
t h i s . mapa . S e l e c i o n a r L o t e ( c o d L o t e ) ;
...
t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;
...
Os padr˜es de projeto s˜o id´ias provadas e testadas, prevenindo a
o a e
reinven¸˜o da roda
ca
Promovem a melhoria da comunica¸˜o entre desenvolvedores
ca
Muitos deles definem diferentes estrat´gias para se abstrair detalhes
e
de implementa¸˜o
ca
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 3 / 42
8. Apresenta¸˜o
ca
Padr˜es de projeto desta apresenta¸˜o est˜o agrupados em:
o ca a
Parte I - Padr˜es de Projeto Cl´ssicos
o a
Padr˜es de Projeto Estruturais
o
Padr˜es de Projeto Comportamentais
o
Padr˜es de Projeto Criacionais
o
Parte II - Padr˜es de Projeto de Sistemas Empresariais
o
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 4 / 42
9. Padr˜es de Projeto Estruturais
o
1 Conte´do
u
2 Apresenta¸˜o
ca
3 Padr˜es de Projeto Estruturais
o
4 Padr˜es de Projeto Comportamentais
o
5 Padr˜es de Projeto Criacionais
o
6 Padr˜es de Projeto de Sistemas Empresariais
o
7 Referˆncias
e
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 5 / 42
10. Padr˜es de Projeto Estruturais
o
Adaptador
Prop´sito: Adequa as opera¸˜es da classe adaptada para a classe
o co
adaptadora
Figura: Adaptador
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 6 / 42
11. Padr˜es de Projeto Estruturais
o
Adaptador
// Exemplo de Uso
p u b l i c c l a s s SistemaX
{
p u b l i c v o i d EnviarSMS ( s t r i n g mensagem )
{
AdaptadorEnvioSMS envioSMS = new AdaptadorEnvioSMS ( ) ;
envioSMS . E n v i a r ( ”9999−9999 ” , mensagem ) ;
}
}
// Exemplo de A d a p t a d o r
u s i n g M i c r o s o f t . WindowsMobile . P o c k e t O u t l o o k ;
p u b l i c c l a s s AdaptadorEnvioSMS
{
p u b l i c v o i d E n v i a r ( s t r i n g numero , s t r i n g mensagem )
{
SmsMessage sms = new SmsMessage ( ) ;
sms . From = new R e c i p i e n t ( t h i s . NumeroOrigem ) ;
sms . Body = mensagem ;
sms . To . Add ( numero ) ;
sms . Send ( ) ;
}
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 7 / 42
12. Padr˜es de Projeto Comportamentais
o
1 Conte´do
u
2 Apresenta¸˜o
ca
3 Padr˜es de Projeto Estruturais
o
4 Padr˜es de Projeto Comportamentais
o
5 Padr˜es de Projeto Criacionais
o
6 Padr˜es de Projeto de Sistemas Empresariais
o
7 Referˆncias
e
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 8 / 42
13. Padr˜es de Projeto Comportamentais
o
Estrat´gia
e
Prop´sito: O objetivo ´ encapsular um conjunto de algoritmos que
o e
resolvem o mesmo problema em classes separadas permitindo que um
algoritmo espec´ıfico possa ser selecionado facilmente atrav´s de uma
e
classe contexto. O padr˜o estrat´gia permite que os algoritmos
a e
possam variar independentemente dos sistemas que os utilizam.
Figura: Estrat´gia
e
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 9 / 42
14. Padr˜es de Projeto Comportamentais
o
Estrat´gia
e
// O a l g o r i t m o de c r i p t o g r a f i a v a r i a com o c o n t e x t o
ContextoEstrategiaCriptografia contextoEstrategiaCriptografiaFraca =
new C o n t e x t o E s t r a t e g i a C r i p t o g r a f i a ( new H M A C S H A 1 E s t r a t e g i a C r i p t o g r a f i a ( ) ) ;
ContextoEstrategiaCriptografia contextoEstrategiaCriptografiaForte =
new C o n t e x t o E s t r a t e g i a C r i p t o g r a f i a ( new M D 5 E s t r a t e g i a C r i p t o g r a f i a ( ) ) ;
...
b y t e [ ] senhaEmBytes = C o n v e r t e P a r a B y t e s ( t h i s . t x t S e n h a . Text ) ;
EstrategiaCriptogradia criptografia1 = contextoEstrategiaCriptografiaForte . ObterEstrategia ();
b y t e [ ] s e n h a C r i p t o g r a d a 1 = c r i p t o g r a f i a 1 . C r i p t o g r a f a r ( senhaEmBytes ) ;
...
EstrategiaCriptografia criptografia2 = contextoEstrategiaCriptografiaFraca . ObterEstrategia ();
b y t e [ ] s e n h a C r i p t o g r a d a 2 = c r i p t o g r a f i a 2 . C r i p t o g r a f a r ( senhaEmBytes ) ;
...
public class ContextoEstrategiaCriptografia
{
private EstrategiaCriptografia estrategia ;
public ContextoEstrategiaCriptografia ( EstrategiaCriptografia estrategia )
{
this . estrategia = estrategia ;
}
public EstrategiaCriptografia ObterEstrategia ()
{
return estrategia ;
}
}
public interface EstrategiaCriptografia
{
byte [ ] C r i p t o g r a f a r ( byte [ ] dados ) ;
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 10 / 42
15. Padr˜es de Projeto Comportamentais
o
Estrat´gia
e
p u b l i c c l a s s HMACSHA1EstrategiaCriptografia : E s t r a t e g i a C r i p t o g r a f i a
{
p u b l i c byte [ ] C r i p t o g r a f a r ( byte [ ] dados )
{
// I m p l e m e n t a c ˜ o e s p e c´ f i c a p a r a HMCA
¸a ı
}
}
public c l a s s MD5EstrategiaCriptografia : EstrategiaCriptografia
{
p u b l i c byte [ ] C r i p t o g r a f a r ( byte [ ] dados )
{
// I m p l e m e n t a c ˜ o e s p e c´ f i c a p a r a MD5
¸a ı
}
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 11 / 42
16. Padr˜es de Projeto Criacionais
o
1 Conte´do
u
2 Apresenta¸˜o
ca
3 Padr˜es de Projeto Estruturais
o
4 Padr˜es de Projeto Comportamentais
o
5 Padr˜es de Projeto Criacionais
o
6 Padr˜es de Projeto de Sistemas Empresariais
o
7 Referˆncias
e
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 12 / 42
17. Padr˜es de Projeto Criacionais
o
Singleton
Prop´sito: Uma classe que segue esse padr˜o, s´ consegue instanciar
o a o
um objeto para toda a classe e tamb´m disponibiliza um acesso global
e
para esse unico objeto atrav´s de um m´todo ou propriedade.
´ e e
Figura: Singleton
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 13 / 42
18. Padr˜es de Projeto Criacionais
o
Singleton
p u b l i c SistemaX
{
p u b l i c void ChecarVersaoDoSistema ()
{
SingletonSistema sistema = SingletonSistema . I n s t a n c i a ;
t h i s . t x t V e r s a o . Text = s i s t e m a . V e r s a o ;
}
}
public c l a s s SingletonSistema
{
// ///// Metodos S i n g l e t o n / / / / / / / / / / / / / / / / / / / / / / / /
// P r o p r i e d a d e que g u a r d a a i n s t a n c i a de S i s t e m a
p r i v a t e s t a t i c Sistema instancia ;
p u b l i c s t a t i c Sistema I n s t a n c i a
{
get
{
i f ( i n s t a n c i a == n u l l ) { i n s t a n c i a = new S i s t e m a ( ) ; }
return instancia ;
}
}
// P r e v i n e que o c o n s t r u t o r s e j a chamado d i r e t a m e n t e
p r i v a t e SingletonSistema () { }
// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
p u b l i c s t r i n g D e s c r i c a o {get ;}
p u b l i c s t r i n g Versao {get ;}
...
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 14 / 42
19. Padr˜es de Projeto Criacionais
o
M´todo de F´brica
e a
Prop´sito: Controlar a cria¸˜o de objetos de v´rias subclasses
o ca a
Figura: M´todo de F´brica
e a
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 15 / 42
20. Padr˜es de Projeto Criacionais
o
M´todo de F´brica
e a
C o n e x a o B a n c o F a c t o r y c o n e x a o B a n c o F a c t o r y = new C o n e x a o B a n c o F a c t o r y ( ) ;
...
IDbConnection conexao = n u l l ;
c o n e x a o = c o n e x a o B a n c o F a c t o r y . C r i a r ( TipoBanco . S Q L S e r v e r ) ;
ExecutarProcessamentoDeDados ( conexao ) ;
c o n e x a o = c o n e x a o B a n c o F a c t o r y . C r i a r ( TipoBanco . O r a c l e ) ;
ExecutarProcessamentoDeDados ( conexao ) ;
...
p u b l i c c l a s s ConexaoBancoFactory
{
p u b l i c I D b C o n n e c t i o n C r i a r ( TipoBanco t i p o B a n c o )
{
switch ( tipoBanco )
{
c a s e SQLServer :
r e t u r n new S q l C o n n e c t i o n ( ) ;
case Oracle :
r e t u r n new OdbcConnection ( . . . . . ) ;
c a s e SQLServerCE :
r e t u r n new S q l C e C o n n e c t i o n ( ) ;
case Access :
r e t u r n OleConnection ( . . . . ) ;
default :
t h r o w new S y s t e m E x c e p t i o n ( . . . ) ;
}
}
}
p u b l i c enum TipoBanco
{
SQLServer ,C Marchezi ()
Humberto Padr˜es de Projeto
o 22 de junho de 2012 16 / 42
21. Padr˜es de Projeto Criacionais
o
F´brica Abstrata
a
Prop´sito: Controlar a cria¸˜o de objetos de uma fam´ de classes
o ca ılia
Figura: F´brica Abstrata
a
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 17 / 42
22. Padr˜es de Projeto Criacionais
o
F´brica Abstrata - Exemplo de Uso
a
// No i n i c i o da e x e c u c a o da a p l i c a c a o
GerenciadorMapa . MapaFactory = new E s r i M a p a F a c t o r y ( . . . ) ;
// R e s t o da a p l i c a ¸ ˜ o a p e n a s r e f e r e n c i a a s i n t e r f a c e s e p o r i s s o ,
ca
// n˜ o c o n h e c e a t e c n o l o g i a e s p e c´ f i c a
a ı
p u b l i c v o i d J a n C a d a s t r o Q u a l q u e r C o i s a : . . . // ( Webform ou Winform )
{
p r i v a t e IMapaLote mapaLote ;
p u b l i c J a n C a d a s t r o Q u a l q u e r C o i s a ( ) // J a n C a d a s t r o Q u a l q u e r C o i s a L o a d
{
IMapaLote mapaLote = GerenciadorMapa . MapaFactory . C r i a r M a p a L o t e ( ) ;
S e r v i c o C a d a s t r o Q u a l q u e r C o i s a s e r v i c o = new S e r v i c o C a d a s t r o Q u a l q u e r C o i s a ( ) ;
. . . // L ´ g i c a da a p l i c a c ˜ o
o ¸a
}
public void btAlgumaCoisa Click ( . . . )
{
long idLote = t h i s . idLoteSelecionado ;
mapaLote . S e l e c i o n a r L o t e ( i d L o t e ) ;
t h i s . s e r v i c o . S e l e c i o n a r L o t e ( t h i s . i d L o t e S e l e c i o n a d o , t h i s . mapaLote ) ;
}
}
// A l ´ g i c a do s e r v i c o pode s e r t e s t a d a sem u s a r o mapa r e a l
o
public c l a s s ServicoCadastroQualquerCoisa
{
p u b l i c S e l e c i o n a r L o t e ( l o n g i d L o t e , IMapaLote mapa )
{
. . . // L ´ g i c a da a p l i c a c ˜ o
o ¸a
mapa . S e l e c i o n a r L o t e ( i d L o t e ) ;
}
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 18 / 42
23. Padr˜es de Projeto Criacionais
o
p u b l i c c l a s s GerenciadorMapa
{
p r i v a t e IMapaFactory m a p a F a c t o r y ;
p u b l i c s t a t i c MapaFactory O b t e r F a c t o r y ( )
{
r e t u r n mapaFactory ;
}
}
p u b l i c i n t e r f a c e IMapaFactory
{
C r i a r M a p a L o t e ( ) : IMapaLote ;
C r i a r M a p a Q u a d r a ( ) : IMapaQuadra ;
C r i a r M a p a C o n s u l t a ( ) : IMapaConsulta ;
}
p u b l i c i n t e r f a c e IMapaLote
{
void SelecionarLote ( long idLote ) ;
LoteEventHandler event LoteSelecionado
}
p u b l i c i n t e r f a c e IMapaQuadra
{
void SelecionarQuadra ( long idQuadra ) ;
event QuadraEventHandler QuadraSelecionada ;
}
p u b l i c i n t e r f a c e IMapaConsulta
{
void SelecionarLote ( long idLote ) ;
event LoteEventHandler LoteSelecionado ;
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 19 / 42
24. Padr˜es de Projeto Criacionais
o
p u b l i c c l a s s E s r i M a p a F a c t o r y : IMapaFactory
{
p u b l i c IMapaLote C r i a r M a p a L o t e ( )
{
r e t u r n new M a p a L o t e E s r i ( ) ;
}
p u b l i c IMapaQuadra C r i a r M a p a Q u a d r a ( )
{
r e t u r n new MapaQuadraEsri ( ) ;
}
p u b l i c IMapaConsulta C r i a r M a p a C o n s u l t a ( )
{
r e t u r n new M a p a C o n s u l t a E s r i ( ) ;
}
}
p u b l i c c l a s s M a p a L o t e E s r i : U s e r C o n t r o l , IMapaLote
{
. . . // I m p l e m e n t a ¸ ˜ o e s p e c´ f i c a do E s r i
ca ı
public void SelecionarLote ( long idLote )
{
. . . // I m p l e m e n t a c ˜ o e s p e c´ f i c a do E s r i
¸a ı
}
public void LoteSelecionado ()
{
. . . // I m p l e m e n t a c ˜ o e s p e c´ f i c a do E s r i
¸a ı
}
. . . // I m p l e m e n t a ¸ ˜ o e s p e c´ f i c a do E s r i
ca ı
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 20 / 42
25. Padr˜es de Projeto Criacionais
o
p u b l i c c l a s s MapaQuadraEsri : U s e r C o n t r o l , IMapaQuadra
{
. . . // I m p l e m e n t a ¸ ˜ o e s p e c´ f i c a do E s r i
ca ı
p u b l i c void SelecionarQuadra ( long idQuadra )
{
. . . // I m p l e m e n t a c ˜ o e s p e c´ f i c a do E s r i
¸a ı
}
public void QuadraSelecionada ()
{
. . . // I m p l e m e n t a c ˜ o e s p e c´ f i c a do E s r i
¸a ı
}
. . . // I m p l e m e n t a ¸ ˜ o e s p e c´ f i c a do E s r i
ca ı
}
p u b l i c c l a s s M a p a C o n s u l t a E s r i : U s e r C o n t r o l , IMapaConsulta
{
. . . // I m p l e m e n t a ¸ ˜ o e s p e c´ f i c a do E s r i
ca ı
public void SelecionarLote ( long idLote )
{
. . . // I m p l e m e n t a c ˜ o e s p e c´ f i c a do E s r i
¸a ı
}
public void LoteSelecionado ()
{
. . . // I m p l e m e n t a c ˜ o e s p e c´ f i c a do E s r i
¸a ı
}
. . . // I m p l e m e n t a ¸ ˜ o e s p e c´ f i c a do E s r i
ca ı
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 21 / 42
26. Padr˜es de Projeto de Sistemas Empresariais
o
1 Conte´do
u
2 Apresenta¸˜o
ca
3 Padr˜es de Projeto Estruturais
o
4 Padr˜es de Projeto Comportamentais
o
5 Padr˜es de Projeto Criacionais
o
6 Padr˜es de Projeto de Sistemas Empresariais
o
7 Referˆncias
e
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 22 / 42
27. Padr˜es de Projeto de Sistemas Empresariais
o
Camada de Servi¸o
c
Prop´sito: Define um limite de aplica¸˜o com uma camada de
o ca
servi¸os que estabelece um conjunto de opera¸˜es e coordena a
c co
resposta da aplica¸˜o em cada opera¸˜o.
ca ca
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 23 / 42
28. Padr˜es de Projeto de Sistemas Empresariais
o
Camada de Servi¸o
c
Caracter´ısticas de um Servi¸o:
c
N˜o cont´m (n˜o deveria) regras de neg´cio
a e a o
Coordena as tarefas pela colabora¸˜o dos objetos do dom´ e a
ca ınio
persistˆncia
e
N˜o mant´m o estado da aplica¸˜o (n˜o contem campos)
a e ca a
Pode mostrar o progresso da realiza¸˜o da tarefa
ca
Figura: Exemplo de Implementa¸˜o Camada de Servi¸o
ca c
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 24 / 42
29. Padr˜es de Projeto de Sistemas Empresariais
o
Camada de Servi¸o
c
public class ServicoCadastroCliente
{
p u b l i c void RegistrarVendaProduto ( s t r i n g c p f C l i e n t e , long idProduto , long idEmpresa )
{
Cliente c l i e n t e = RecuperarClientePeloCPF ( c p f C l i e n t e ) ;
Produto produto = RecuperarProdutoPeloId ( idProduto ) ;
Empresa e m p r e s a = R e c u p e r a r E m p r e s a P e l o I d ( i d E m p r e s a ) ;
empresa . V e r i f i c a r S e P r o d u t o E s t a D i s p o n i v e l ( produto ) ;
empresa . VenderProduto ( produto , c l i e n t e ) ;
DAO. F a c t o r y . S a l v a r ( e m p r e s a ) ;
}
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 25 / 42
30. Padr˜es de Projeto de Sistemas Empresariais
o
Portal para Dados Tabulados (Table Data Gateway)
Prop´sito: Oferece uma instˆncia de uma classe que funciona como
o a
um portal para acessar e modificar dados de uma tabela no
banco-de-dados.
Figura: Classes s˜o Portal para Acessar a Tabela
a
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 26 / 42
31. Padr˜es de Projeto de Sistemas Empresariais
o
Portal para Dados Tabulados (Table Data Gateway)
Vantagens:
Evita que comandos SQL repetidos se espalhem pela aplica¸˜o. (O mal
ca
do copy-paste).
Isola comantos espec´
ıficos de um banco nessas classes.
Permite a execu¸˜o de testes na l´gica da aplica¸˜o sem ter que usar
ca o ca
acesso ao banco-de-dados.
Abordagem mais simples e de f´cil entendimento
a
Observa¸˜es:
co
Esse tipo de padr˜o ´ recomendado quando a camada de persistˆncia
a e e
n˜o puder executar um determinado acesso a dados. Ex: execu¸˜o de
a ca
stored procedures e SQL muito complexos e espec´
ıficos
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 27 / 42
32. Padr˜es de Projeto de Sistemas Empresariais
o
Portal para Dados Tabulados (Table Data Gateway)
public class ServicoCadastroCliente
{
p u b l i c l o n g I n c l u i r C l i e n t e ( s t r i n g nome , s t r i n g c p f , s t r i n g c e p E n d e r e c o , s t r i n g n u m e r o E n d e r e c o )
{
s t r i n g s q l = S t r i n g . Format ( ” i n s e r t i n t o C l i e n t e ( nome , c p f , cep , numero ) v a l u e s ( ’ { 0 } ’ , ’ { 1 } ’ , ’ {
nome , c p f , c e p E n d e r e c o , n u m e r o E n d e r e c o ) ;
I D b C o n n e c t i o n c nx = O b t e r C o n e x a o ( ) ;
IDbCommand cmd = cn x . CreateCommand ( ) ;
cmd . ExecuteCommand ( s q l ) ;
}
p u b l i c v o i d A l t e r a r N o m e ( i d C l i e n t e , nome )
{
...
}
p u b l i c DataTable O b t e r P e l o I d ( l o n g i d )
{
s t r i n g s q l = S t r i n g . Format ( ” s e l e c t c o d C l i e n t e , nome , c p f , cep , numero w h e r e c o d C l i e n t e = {0}”
I D b C o n n e c t i o n c nx = O b t e r C o n e x a o ( ) ;
DataAdapter d a t a A d a p t e r = O b t e r D a t a A d a p t e r P r e e n c h i d o ( s q l , c nx ) ;
return dataAdapter . Tables [ 0 ] ;
}
p u b l i c D a t a T a b l e ObterPeloNome ( s t r i n g nome )
{
...
}
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 28 / 42
33. Padr˜es de Projeto de Sistemas Empresariais
o
Modelo de Dom´ (Domain Model)
ınio
Prop´sito: Consiste num modelo de classes que incorpora tanto
o
comportamento (l´gica) quanto os dados (campos).
o
Figura: Um Modelo de Dom´
ınio
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 29 / 42
34. Padr˜es de Projeto de Sistemas Empresariais
o
Vantagens:
Especialmente vantajoso para regras de neg´cio complicadas e
o
dinˆmicas normalmente envolvendo v´rios tipos de c´lculos, valida¸˜es
a a a co
e deriva¸˜es
co
Isola a l´gica de neg´cio das opera¸˜es de leitura/modifica¸˜es de
o o co co
dados, logo ´ independente de esquema de persistˆncia e
e e
bancos-de-dados
Permite a execu¸˜o de testes unit´rios automatizados na l´gica de
ca a o
neg´cio contida nessas classes
o
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 30 / 42
35. Padr˜es de Projeto de Sistemas Empresariais
o
Objeto Valor (Value Object)
Classe Dinheiro
public c l a s s Dinheiro
{
p u b l i c D i n h e i r o ( Moeda moeda , d e c i m a l v a l o r ) { Moeda = moeda ; V a l o r = v a l o r ; }
p u b l i c Moeda { g e t ; s e t ; }
p u b l i c Valor {get ; s e t ;}
}
Primeiro problema:
Considere a situa¸˜o
ca
D i n h e i r o p r e c o = new D i n h e i r o ( ”R” , 4 5 ) ; // 45 r e a i s
produto1 . Preco = preco ; // p r o d u t o 1 c u s t a 45
preco . Valor = 80; // V a l o r do p r e ¸ o ´ 80
c e
produto2 . Preco = preco ; // p r o d u t o 2 c u s t a 80 e p r o d u t o 1 c u s t a 80 ! !
TODA instˆncia de uma classe no .NET ´ tratada como referˆncia e
a e e
isso pode ter efetios colaterais
Segundo problema:
Considere a situa¸˜o
ca
D i n h e i r o p r e c o 1 = new D i n h e i r o ( ”R” , 8 0 ) ; // 80 r e a i s
D i n h e i r o p r e c o 2 = new D i n h e i r o ( ”R” , 8 0 ) ; // 80 r e a i s
b o o l e h I g u a l = ( p r e c o 1 == p r e c o 2 ) ; // FALSE : A r e f e r ˆ n c i a em mem´ ria ´ comparada
e o e
Mesmo sendo instˆncias distintas o resultado deveria ser TRUE
a
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 31 / 42
36. Padr˜es de Projeto de Sistemas Empresariais
o
Solu¸˜o: Criar classes com o padr˜o objeto-valor
ca a
public c l a s s Dinheiro
{
p u b l i c D i n h e i r o ( Moeda moeda , d e c i m a l v a l o r )
{
Moeda = moeda ;
Valor = valor ;
}
p u b l i c Moeda Moeda { g e t ; p r o t e c t e d s e t ; }
p u b l i c decimal Valor { get ; protected set ; }
p u b l i c o v e r r i d e bool Equals ( object obj )
{
r e t u r n Dinheiro . EhIgual ( t h i s , obj as Dinheiro ) ;
}
p u b l i c o v e r r i d e i n t GetHashCode ( )
{
s t r i n g i d e n t i f i c a c a o = t h i s . Moeda . GetHashCode ( ) . T o S t r i n g ( ) + t h i s . V a l o r . T o S t r i n g ( ) ;
r e t u r n i d e n t i f i c a c a o . GetHashCode ( ) ;
}
p u b l i c s t a t i c b o o l o p e r a t o r ==(D i n h e i r o l h s , D i n h e i r o r h s )
{
return Dinheiro . EhIgual ( lhs , rhs ) ;
}
p u b l i c s t a t i c b o o l o p e r a t o r !=( D i n h e i r o l h s , D i n h e i r o r h s )
{
return ! Dinheiro . EhIgual ( lhs , rhs ) ;
}
p r i v a t e s t a t i c b o o l E h I g u a l ( D i n h e i r o d1 , D i n h e i r o d2 )
{
r e t u r n ( ( d1 . Moeda == d2 . Moeda ) && ( d1 . V a l o r == d2 . V a l o r ) ) ;
}
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 32 / 42
37. Padr˜es de Projeto de Sistemas Empresariais
o
D i n h e i r o p r e c o 1 = new D i n h e i r o ( ”R” , 4 5 ) ; // 45 r e a i s
produto1 . Preco = preco1 ; // p r o d u t o 1 c u s t a 45
D i n h e i r o p r e c o 2 = new D i n h e i r o ( ”R” , 8 0 ) ; // 80 r e a i s
produto2 . Preco = preco2 ; // p r o d u t o 2 c u s t a 80 e p r o d u t o 1 c u s t a 45 ! !
// ERRO : O b j e t o−v a l o r ´ i m u t ´ v e l , n˜ o s e pode a l t e r ´ −l o a p o s a c r i a ¸ ˜ o
e a a a ´ ca
preco1 . Valor = 70; // ERRO : Gera e x c e c ˜ o , n˜ o s e pode a l t e r a r o v a l o r
¸a a
p r e c o 1 . Moeda = d o l a r ; // ERRO : Gera e x c e ¸ ˜ o , n˜ o s e pode a l t e r a r a moeda
ca a
Prop´sito: S˜o classes que representam valores imut´veis (n˜o
o a a a
mudam) e cujo crit´rio de igualdade n˜o ´ baseado em uma
e a e
propriedade Id. Logo, essas classes n˜o possuem Id.
a
Figura: Dinheiro ´ um Objeto-Valor, Moeda ´ uma Entidade
e e
Vantagens:
Permite simplificar conceitos mais complexos
Evita que as referˆncias tenham que ser gerenciadas.
e
Observa¸˜o: Em .NET, um objeto tamb´m pode ser definido como
ca e
objeto-valor se o seu tipo ´ um Struct
e
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 33 / 42
38. Padr˜es de Projeto de Sistemas Empresariais
o
Modelo Vis˜o Controlador (Model View Controller)
a
Prop´sito: Surgiu junto com a plataforma Smalltalk e a sua id´ia ´ a
o e e
separa¸˜o das classes de um sistema em trˆs pap´is distintos:
ca e e
Modelo: Classe n˜o visual com dados e comportamento. Uma
a
informa¸˜o no sistema.
ca
Vis˜o: Classe que representa o modelo visualmente na interface gr´fica.
a a
Controlador: Recebe a entrada de dados, manipula o modelo e atualiza
a vis˜o apropriadamente.
a
Figura: Pacotes MVC
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 34 / 42
39. Padr˜es de Projeto de Sistemas Empresariais
o
Modelo Vis˜o Controlador (Model View Controller)
a
Vantagens:
Guia a separa¸˜o de classes com pap´is diferentes
ca e
Modelo pode ser representado visualmente de v´rias formas
a
Facilita o teste de objetos n˜o visuais como o modelo
a
Figura: Exemplo de Implementa¸˜o MVC
ca
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 35 / 42
40. Padr˜es de Projeto de Sistemas Empresariais
o
Modelo Vis˜o Controlador (Model View Controller)
a
Modelo
p u b l i c c l a s s Contato
{
p u b l i c C o n t a t o ( s t r i n g nome , s t r i n g e m a i l )
{
Nome = nome ;
Email = email ;
}
p u b l i c long Id { get ; protected set ; }
p u b l i c s t r i n g Nome { g e t ; s e t ; }
p u b l i c s t r i n g Email { get ; s e t ; }
}
Vis˜o
a
public i n t e r f a c e ICadastroContatoView
{
long IdContato { get ; set ; }
s t r i n g NomeContato { g e t ; s e t ; }
s t r i n g EmailContato { get ; s e t ; }
bool HabilitarIdContato { set ; }
bool HabilitarNomeContato { set ; }
bool HabilitarEmailContato { set ; }
event EventHandler I n s e r i r C l i e n t e ;
event EventHandler NovoCliente ;
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 36 / 42
41. Padr˜es de Projeto de Sistemas Empresariais
o
Modelo Vis˜o Controlador - Controlador
a
public c l a s s CadastroContatoControlador
{
p r i v a t e ICadastroContatoView visao ;
public CadastroContatoControlador ( ICadastroContatoView visao )
{
visao = visao ;
v i s a o . I n s e r i r C l i e n t e += new E v e n t H a n d l e r ( C l i e n t e I n s e r i d o ) ;
v i s a o . N o v o C l i e n t e += new E v e n t H a n d l e r ( N o v o C l i e n t e ) ;
}
void NovoCliente ( o b j e c t sender , EventArgs e )
{
this . visao . HabilitarIdContato = true ;
t h i s . v i s a o . HabilitarNomeContato = true ;
this . visao . HabilitarEmailContato = true ;
t h i s . v i s a o . IdContato = 0;
t h i s . v i s a o . NomeContato = s t r i n g . Empty ;
t h i s . v i s a o . E m a i l C o n t a t o = s t r i n g . Empty ;
}
void C l i e n t e I n s e r i d o ( o b j e c t sender , EventArgs e )
{
C o n t a t o c o n t a t o = new C o n t a t o ( t h i s . v i s a o . NomeContato , t h i s . v i s a o . E m a i l C o n t a t o ) ;
P e r s i s t e n c i a . Salvar ( contato ) ;
this . visao . HabilitarIdContato = false ;
t h i s . v i s a o . HabilitarNomeContato = f a l s e ;
this . visao . HabilitarEmailContato = false ;
}
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 37 / 42
42. Padr˜es de Projeto de Sistemas Empresariais
o
Modelo Vis˜o Controlador (Model View Controller)
a
p u b l i c p a r t i a l c l a s s J a n C a d a s t r o C o n t a t o : Form , I C a d a s t r o C o n t a t o V i e w
{
private CadastroContatoControlador controlador ;
p u b l i c JanCadastroContato ()
{
InitializeComponent ();
c o n t r o l a d o r = new C a d a s t r o C o n t a t o C o n t r o l a d o r ( t h i s ) ;
}
p u b l i c b o o l H a b i l i t a r N o m e C o n t a t o { s e t { t h i s . txtNome . E n a b l e d = v a l u e ; } }
p u b l i c bool H a b i l i t a r E m a i l C o n t a t o { s e t { t h i s . txtContato . Enabled = value ; } }
p u b l i c b o o l H a b i l i t a r I d C o n t a t o { s e t { t h i s . numIdContato . E n a b l e d = v a l u e ; } }
p ubl ic long IdContato
{
g e t { r e t u r n ( l o n g ) t h i s . numIdContato . V a l u e ; }
s e t { t h i s . numIdContato . V a l u e = v a l u e ; }
}
p u b l i c s t r i n g NomeContato
{
g e t { r e t u r n t h i s . txtNome . Text ; }
s e t { t h i s . txtNome . Text = v a l u e ; }
}
p u b l i c s t r i n g EmailContato
{
g e t { r e t u r n t h i s . t x t C o n t a t o . Text ; }
s e t { t h i s . t x t C o n t a t o . Text = v a l u e ; }
}
p u b l i c event EventHandler I n s e r i r C l i e n t e ;
p r i v a t e void b t I n c l u i r C l i c k ( o b j e c t sender , EventArgs e ) { t h i s . I n s e r i r C l i e n t e ( sender , e ) ;
p u b l i c event EventHandler NovoCliente ;
p r i v a t e void btNovo Click ( o b j e c t sender , EventArgs e ) { t h i s . NovoCliente ( sender , e ) ; }
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 38 / 42
43. Padr˜es de Projeto de Sistemas Empresariais
o
Modelo Vis˜o Controlador (Model View Controller)
a
p u b l i c p a r t i a l c l a s s W e b C a d a s t r o C o n t a t o : System . Web . UI . Page , I C a d a s t r o C o n t a t o V i e w
{
private CadastroContatoControlador controlador ;
p r o t e c t e d v o i d Page Load ( o b j e c t s e n d e r , E v e n t A r g s e )
{
c o n t r o l a d o r = new C a d a s t r o C o n t a t o C o n t r o l a d o r ( t h i s ) ;
}
p u b l i c bool H a b i l i t a r I d C o n t a t o { s e t { t h i s . txtIdContato . Enabled = value ; } }
p u b l i c b o o l H a b i l i t a r N o m e C o n t a t o { s e t { t h i s . tx tNome Conta to . E n a b l e d = v a l u e ; } }
p u b l i c bool H a b i l i t a r E m a i l C o n t a t o { s e t { t h i s . txtEmailContato . Enabled = value ; } }
p ubl ic long IdContato
{
g e t { r e t u r n I n t 6 4 . P a r s e ( t h i s . t x t I d C o n t a t o . Text ) ; }
s e t { t h i s . t x t I d C o n t a t o . Text = v a l u e . T o S t r i n g ( ) ; }
}
p u b l i c s t r i n g NomeContato
{
g e t { r e t u r n t h i s . txtNo meCon tato . Text ; }
s e t { t h i s . tx tNome Conta to . Text = v a l u e ; }
}
p u b l i c s t r i n g EmailContato
{
g e t { r e t u r n t h i s . t x t E m a i l C o n t a t o . Text ; }
s e t { t h i s . t x t E m a i l C o n t a t o . Text = v a l u e ; }
}
p u b l i c event EventHandler NovoCliente ;
p r o t e c t e d void btNovoContato Click ( o b j e c t sender , EventArgs e ) { t h i s . NovoCliente ( sender , e
p u b l i c event EventHandler I n s e r i r C l i e n t e ;
p r o t e c t e d void b t I n c l u i r C o n t a t o C l i c k ( o b j e c t sender , EventArgs e ) { t h i s . I n s e r i r C l i e n t e ( sen
}
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 39 / 42
44. Padr˜es de Projeto de Sistemas Empresariais
o
Exerc´ Data Table Gateway
ıcio
Criar um Data Table Gateway para o sistema do exerc´ anterior
ıcio
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 40 / 42
45. Padr˜es de Projeto de Sistemas Empresariais
o
Exerc´ MVC
ıcio
Aplica¸˜o Winforms e Webforms
ca
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 41 / 42
46. Referˆncias
e
Referˆncias
e
data & object factory:
http://www.dofactory.com/Patterns/Patterns.aspx
Patterns of Enterprise Application Architecture - Martin Fowler:
http://martinfowler.com/eaaCatalog/
Humberto C Marchezi () Padr˜es de Projeto
o 22 de junho de 2012 42 / 42