Post on 09-Jul-2015
description
Padroes de Projeto
Humberto C Marchezi
22 de junho de 2012
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 1 / 42
Conteudo
1 Conteudo
2 Apresentacao
3 Padroes de Projeto Estruturais
4 Padroes de Projeto Comportamentais
5 Padroes de Projeto Criacionais
6 Padroes de Projeto de Sistemas Empresariais
7 Referencias
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 2 / 42
Apresentacao
Padroes de Projeto
Solucao reutilizavel para um problema que ocorre de tempos emtempos
// Como eu f a c o para i s o l a r a tecnologiaXPTO do meu s i s t e m a ??MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;. . .t h i s . mapa . S e l e c i o n a r L o t e ( codLote ) ;. . .t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;. . .
Os padroes de projeto sao ideias provadas e testadas, prevenindo areinvencao da roda
Promovem a melhoria da comunicacao entre desenvolvedores
Muitos deles definem diferentes estrategias para se abstrair detalhesde implementacao
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 3 / 42
Apresentacao
Padroes de Projeto
Solucao reutilizavel para um problema que ocorre de tempos emtempos
// Como eu f a c o para i s o l a r a tecnologiaXPTO do meu s i s t e m a ??MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;. . .t h i s . mapa . S e l e c i o n a r L o t e ( codLote ) ;. . .t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;. . .
Os padroes de projeto sao ideias provadas e testadas, prevenindo areinvencao da roda
Promovem a melhoria da comunicacao entre desenvolvedores
Muitos deles definem diferentes estrategias para se abstrair detalhesde implementacao
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 3 / 42
Apresentacao
Padroes de Projeto
Solucao reutilizavel para um problema que ocorre de tempos emtempos
// Como eu f a c o para i s o l a r a tecnologiaXPTO do meu s i s t e m a ??MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;. . .t h i s . mapa . S e l e c i o n a r L o t e ( codLote ) ;. . .t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;. . .
Os padroes de projeto sao ideias provadas e testadas, prevenindo areinvencao da roda
Promovem a melhoria da comunicacao entre desenvolvedores
Muitos deles definem diferentes estrategias para se abstrair detalhesde implementacao
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 3 / 42
Apresentacao
Padroes de Projeto
Solucao reutilizavel para um problema que ocorre de tempos emtempos
// Como eu f a c o para i s o l a r a tecnologiaXPTO do meu s i s t e m a ??MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;. . .t h i s . mapa . S e l e c i o n a r L o t e ( codLote ) ;. . .t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;. . .
Os padroes de projeto sao ideias provadas e testadas, prevenindo areinvencao da roda
Promovem a melhoria da comunicacao entre desenvolvedores
Muitos deles definem diferentes estrategias para se abstrair detalhesde implementacao
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 3 / 42
Apresentacao
Padroes de Projeto
Solucao reutilizavel para um problema que ocorre de tempos emtempos
// Como eu f a c o para i s o l a r a tecnologiaXPTO do meu s i s t e m a ??MapaLoteTecnologiaXPTO mapa = new MapaLoteTecnologiaXPTO ( . . . ) ;. . .t h i s . mapa . S e l e c i o n a r L o t e ( codLote ) ;. . .t h i s . t x t I n s c r i c a o L o t e . Text = . . . ;. . .
Os padroes de projeto sao ideias provadas e testadas, prevenindo areinvencao da roda
Promovem a melhoria da comunicacao entre desenvolvedores
Muitos deles definem diferentes estrategias para se abstrair detalhesde implementacao
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 3 / 42
Apresentacao
Padroes de projeto desta apresentacao estao agrupados em:
Parte I - Padroes de Projeto Classicos
Padroes de Projeto EstruturaisPadroes de Projeto ComportamentaisPadroes de Projeto Criacionais
Parte II - Padroes de Projeto de Sistemas Empresariais
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 4 / 42
Padroes de Projeto Estruturais
1 Conteudo
2 Apresentacao
3 Padroes de Projeto Estruturais
4 Padroes de Projeto Comportamentais
5 Padroes de Projeto Criacionais
6 Padroes de Projeto de Sistemas Empresariais
7 Referencias
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 5 / 42
Padroes de Projeto Estruturais
Adaptador
Proposito: Adequa as operacoes da classe adaptada para a classeadaptadora
Figura: Adaptador
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 6 / 42
Padroes de Projeto Estruturais
Adaptador
// Exemplo de Usop 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 Adaptadoru s i n g M i c r o s o f t . WindowsMobile . PocketOut look ;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 () Padroes de Projeto 22 de junho de 2012 7 / 42
Padroes de Projeto Comportamentais
1 Conteudo
2 Apresentacao
3 Padroes de Projeto Estruturais
4 Padroes de Projeto Comportamentais
5 Padroes de Projeto Criacionais
6 Padroes de Projeto de Sistemas Empresariais
7 Referencias
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 8 / 42
Padroes de Projeto Comportamentais
Estrategia
Proposito: O objetivo e encapsular um conjunto de algoritmos queresolvem o mesmo problema em classes separadas permitindo que umalgoritmo especıfico possa ser selecionado facilmente atraves de umaclasse contexto. O padrao estrategia permite que os algoritmospossam variar independentemente dos sistemas que os utilizam.
Figura: EstrategiaHumberto C Marchezi () Padroes de Projeto 22 de junho de 2012 9 / 42
Padroes de Projeto Comportamentais
Estrategia
// 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 oC 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 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 F r a c a =
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 HMACSHA1EstrategiaCriptograf ia ( ) ) ;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 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 F o r t e =
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 ) ;E s t r a t e g i a C r i p t o g r a d i a c r i p t o g r a f i a 1 = 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 F o r t e . O b t e r E s t r a t e g i a ( ) ;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 ) ;. . .E s t r a t e g i a C r i p t o g r a f i a c r i p t o g r a f i a 2 = 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 F r a c a . O b t e r E s t r a t e g i a ( ) ;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 ) ;. . .
p u b l i c c l a s s 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{
p r i v a t e E s t r a t e g i a C r i p t o g r a f i a e s t r a t e g i a ;p u b l i c 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 ( E s t r a t e g i a C r i p t o g r a f i a e s t r a t e g i a ){
t h i s . e s t r a t e g i a = e s t r a t e g i a ;}p u b l i c E s t r a t e g i a C r i p t o g r a f i a O b t e r E s t r a t e g i a ( ){
r e t u r n e s t r a t e g i a ;}
}
p u b l i c i n t e r f a c e 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 [ ] C r i p t o g r a f a r ( b y t e [ ] dados ) ;}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 10 / 42
Padroes de Projeto Comportamentais
Estrategia
p u b l i c c l a s s HMACSHA1EstrategiaCriptograf ia : 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 b y t e [ ] C r i p t o g r a f a r ( b y t e [ ] dados ){
// Implementa c ao e s p e c ı f i c a para HMCA}
}
p u b l i c c l a s s 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 : 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 b y t e [ ] C r i p t o g r a f a r ( b y t e [ ] dados ){
// Implementa c ao e s p e c ı f i c a para MD5}
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 11 / 42
Padroes de Projeto Criacionais
1 Conteudo
2 Apresentacao
3 Padroes de Projeto Estruturais
4 Padroes de Projeto Comportamentais
5 Padroes de Projeto Criacionais
6 Padroes de Projeto de Sistemas Empresariais
7 Referencias
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 12 / 42
Padroes de Projeto Criacionais
Singleton
Proposito: Uma classe que segue esse padrao, so consegue instanciarum objeto para toda a classe e tambem disponibiliza um acesso globalpara esse unico objeto atraves de um metodo ou propriedade.
Figura: Singleton
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 13 / 42
Padroes de Projeto Criacionais
Singleton
p u b l i c SistemaX{
p u b l i c v o i d ChecarVersaoDoSistema ( ){
S i n g l e t o n S i s t e m a s i s t e m a = S i n g l e t o n S i s t e m a . 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 . Versao ;
}}
p u b l i c c l a s s S i n g l e t o n S i s t e m a{
// ///// Metodos S i n g l e t o n ////////////////////////// P r o p r i e d a d e que guarda a i n s t a n c i a de S i s temap r i v a t e s t a t i c Sistema i n s t a n c i a ;p u b l i c s t a t i c Sistema I n s t a n c i a{
g e t{
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 Sistema ( ) ; }r e t u r n i n s t a n c i a ;
}}// 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 ep r i v a t e S i n g l e t o n S i s t e m a ( ) { }// ////////////////////////////////////////////////p u b l i c s t r i n g D e s c r i c a o {g e t ;}p u b l i c s t r i n g Versao {g e t ;}. . .
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 14 / 42
Padroes de Projeto Criacionais
Metodo de Fabrica
Proposito: Controlar a criacao de objetos de varias subclasses
Figura: Metodo de Fabrica
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 15 / 42
Padroes de Projeto Criacionais
Metodo de Fabrica
ConexaoBancoFactory conexaoBancoFactory = new ConexaoBancoFactory ( ) ;. . .IDbConnection conexao = n u l l ;conexao = conexaoBancoFactory . C r i a r ( TipoBanco . SQLServer ) ;ExecutarProcessamentoDeDados ( conexao ) ;conexao = conexaoBancoFactory . 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 IDbConnection C r i a r ( TipoBanco t ipoBanco ){
s w i t c h ( t ipoBanco ){
c a s e SQLServer :r e t u r n new SqlConnect ion ( ) ;
c a s e O r a c l e :r e t u r n new OdbcConnection ( . . . . . ) ;
c a s e SQLServerCE :r e t u r n new SqlCeConnect ion ( ) ;
c a s e A cc e ss :r e t u r n OleConnect ion ( . . . . ) ;
d e f a u l t :throw new SystemExcept ion ( . . . ) ;
}}
}
p u b l i c enum TipoBanco{
SQLServer ,Orac le ,SQLServerCE ,A cc es s
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 16 / 42
Padroes de Projeto Criacionais
Fabrica Abstrata
Proposito: Controlar a criacao de objetos de uma famılia de classes
Figura: Fabrica Abstrata
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 17 / 42
Padroes de Projeto Criacionais
Fabrica Abstrata - Exemplo de Uso
// No i n i c i o da execucao da a p l i c a c a oGerenciadorMapa . MapaFactory = new Esr iMapaFactory ( . . . ) ;
// Resto da a p l i c a c a o apenas r e f e r e n c i a as i n t e r f a c e s e por i s s o ,// nao conhece a t e c n o l o g i a e s p e c ı f i c ap u b l i c v o i d JanCadastroQualquerCoisa : . . . // ( Webform ou Winform ){
p r i v a t e IMapaLote mapaLote ;p u b l i c JanCadastroQualquerCoisa ( ) // 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 . Cr iarMapaLote ( ) ;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 o g i c a da a p l i c a c a o
}p u b l i c v o i d b t A l g u m a C o i s a C l i c k ( . . . ){
l o n g i d 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 ;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 o 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 lp u b l i c c l a s s 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{
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 o g i c a da a p l i c a c a omapa . S e l e c i o n a r L o t e ( i d L o t e ) ;
}}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 18 / 42
Padroes de Projeto Criacionais
p u b l i c c l a s s GerenciadorMapa{
p r i v a t e IMapaFactory mapaFactory ;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{
Cr iarMapaLote ( ) : IMapaLote ;Cr iarMapaQuadra ( ) : 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{
v o i d S e l e c i o n a r L o t e ( l o n g i d L o t e ) ;L o t e E v e n t H a n d l e r e v e n t L o t e S e l e c i o n a d o
}
p u b l i c i n t e r f a c e IMapaQuadra{
v o i d S e l e c i o n a r Q u a d r a ( l o n g idQuadra ) ;e v e n t QuadraEventHandler Q u a d r a S e l e c i o n a d a ;
}
p u b l i c i n t e r f a c e IMapaConsulta{
v o i d S e l e c i o n a r L o t e ( l o n g i d L o t e ) ;e v e n t L o t e E v e n t H a n d l e r L o t e S e l e c i o n a d o ;
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 19 / 42
Padroes de Projeto Criacionais
p u b l i c c l a s s Esr iMapaFactory : IMapaFactory{
p u b l i c IMapaLote Cr iarMapaLote ( ){
r e t u r n new MapaLoteEsri ( ) ;}p u b l i c IMapaQuadra CriarMapaQuadra ( ){
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 MapaConsultaEsr i ( ) ;}
}
p u b l i c c l a s s MapaLoteEsri : UserContro l , IMapaLote{
. . . // Implementa c ao e s p e c ı f i c a do E s r ip u b l i c v o i d S e l e c i o n a r L o t e ( l o n g i d L o t e ){
. . . // Implementa c ao e s p e c ı f i c a do E s r i}p u b l i c v o i d L o t e S e l e c i o n a d o ( ){
. . . // Implementa c ao e s p e c ı f i c a do E s r i}. . . // Implementa c ao e s p e c ı f i c a do E s r i
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 20 / 42
Padroes de Projeto Criacionais
p u b l i c c l a s s MapaQuadraEsri : UserContro l , IMapaQuadra{
. . . // Implementa c ao e s p e c ı f i c a do E s r ip u b l i c v o i d S e l e c i o n a r Q u a d r a ( l o n g idQuadra ){
. . . // Implementa c ao e s p e c ı f i c a do E s r i}p u b l i c v o i d Q u a d r a S e l e c i o n a d a ( ){
. . . // Implementa c ao e s p e c ı f i c a do E s r i}. . . // Implementa c ao e s p e c ı f i c a do E s r i
}
p u b l i c c l a s s MapaConsultaEsr i : UserContro l , IMapaConsulta{
. . . // Implementa c ao e s p e c ı f i c a do E s r ip u b l i c v o i d S e l e c i o n a r L o t e ( l o n g i d L o t e ){
. . . // Implementa c ao e s p e c ı f i c a do E s r i}p u b l i c v o i d L o t e S e l e c i o n a d o ( ){
. . . // Implementa c ao e s p e c ı f i c a do E s r i}. . . // Implementa c ao e s p e c ı f i c a do E s r i
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 21 / 42
Padroes de Projeto de Sistemas Empresariais
1 Conteudo
2 Apresentacao
3 Padroes de Projeto Estruturais
4 Padroes de Projeto Comportamentais
5 Padroes de Projeto Criacionais
6 Padroes de Projeto de Sistemas Empresariais
7 Referencias
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 22 / 42
Padroes de Projeto de Sistemas Empresariais
Camada de Servico
Proposito: Define um limite de aplicacao com uma camada deservicos que estabelece um conjunto de operacoes e coordena aresposta da aplicacao em cada operacao.
Figura: Camada de ServicoHumberto C Marchezi () Padroes de Projeto 22 de junho de 2012 23 / 42
Padroes de Projeto de Sistemas Empresariais
Camada de Servico
Caracterısticas de um Servico:
Nao contem (nao deveria) regras de negocio
Coordena as tarefas pela colaboracao dos objetos do domınio e apersistencia
Nao mantem o estado da aplicacao (nao contem campos)
Pode mostrar o progresso da realizacao da tarefa
Figura: Exemplo de Implementacao Camada de Servico
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 24 / 42
Padroes de Projeto de Sistemas Empresariais
Camada de Servico
p u b l i c c l a s s S e r v i c o C a d a s t r o C l i e n t e{
p u b l i c v o i d R e g i s t r a r V e n d a P r o d u t o ( s t r i n g c p f C l i e n t e , l o n g idProduto , l o n g idEmpresa ){
C l i e n t e c l i e n t e = R e c u p e r a r C l i e n t e P e l o C P F ( c p f C l i e n t e ) ;Produto produto = R e c u p e r a r P r o d u t o P e l o I d ( i d P r o d u t o ) ;Empresa empresa = R e c u p e r a r E m p r e s a P e l o I d ( idEmpresa ) ;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 ( p roduto ) ;empresa . VenderProduto ( produto , c l i e n t e ) ;DAO. F a c t o r y . S a l v a r ( empresa ) ;}
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 25 / 42
Padroes de Projeto de Sistemas Empresariais
Portal para Dados Tabulados (Table Data Gateway)
Proposito: Oferece uma instancia de uma classe que funciona comoum portal para acessar e modificar dados de uma tabela nobanco-de-dados.
Figura: Classes sao Portal para Acessar a Tabela
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 26 / 42
Padroes de Projeto de Sistemas Empresariais
Portal para Dados Tabulados (Table Data Gateway)
Vantagens:Evita que comandos SQL repetidos se espalhem pela aplicacao. (O maldo copy-paste).Isola comantos especıficos de um banco nessas classes.Permite a execucao de testes na logica da aplicacao sem ter que usaracesso ao banco-de-dados.Abordagem mais simples e de facil entendimento
Observacoes:Esse tipo de padrao e recomendado quando a camada de persistencianao puder executar um determinado acesso a dados. Ex: execucao destored procedures e SQL muito complexos e especıficos
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 27 / 42
Padroes de Projeto de Sistemas Empresariais
Portal para Dados Tabulados (Table Data Gateway)
p u b l i c c l a s s S e r v i c o C a d a s t r o C l i e n t e{
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 cpf , s t r i n g cepEndereco , s t r i n g numeroEndereco ){
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 , cpf , cep , numero ) v a l u e s ( ’{0} ’ , ’{1} ’ , ’{2} ’ , ’{3} ’ ) ” ,nome , cpf , cepEndereco , numeroEndereco ) ;
IDbConnection cnx = ObterConexao ( ) ;IDbCommand cmd = cnx . CreateCommand ( ) ;cmd . ExecuteCommand ( s q l ) ;
}p u b l i c v o i d AlterarNome ( 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 , cpf , cep , numero where c o d C l i e n t e = {0}” , i d ) ;IDbConnection cnx = ObterConexao ( ) ;DataAdapter d a t a A d a p t e r = O b t e r D a t a Ad a p t e r P r e e n c h i d o ( s q l , cnx ) ;r e t u r n d a t a A d a p t e r . T a b l e s [ 0 ] ;
}p u b l i c DataTable ObterPeloNome ( s t r i n g nome ){
. . .}
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 28 / 42
Padroes de Projeto de Sistemas Empresariais
Modelo de Domınio (Domain Model)
Proposito: Consiste num modelo de classes que incorpora tantocomportamento (logica) quanto os dados (campos).
Figura: Um Modelo de Domınio
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 29 / 42
Padroes de Projeto de Sistemas Empresariais
Vantagens:Especialmente vantajoso para regras de negocio complicadas edinamicas normalmente envolvendo varios tipos de calculos, validacoese derivacoesIsola a logica de negocio das operacoes de leitura/modificacoes dedados, logo e independente de esquema de persistencia ebancos-de-dadosPermite a execucao de testes unitarios automatizados na logica denegocio contida nessas classes
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 30 / 42
Padroes de Projeto de Sistemas Empresariais
Objeto Valor (Value Object)
Classe Dinheirop u b l i c c l a s s D i n h e i r o{
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 V a l o r {g e t ; s e t ;}
}
Primeiro problema:Considere a situacaoD 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 sproduto1 . Preco = p r e c o ; // produto1 c u s t a 45p r e c o . V a l o r = 8 0 ; // V a l o r do p r e c o e 80produto2 . Preco = p r e c o ; // produto2 c u s t a 80 e produto1 c u s t a 80 ! !
TODA instancia de uma classe no .NET e tratada como referencia eisso pode ter efetios colaterais
Segundo problema:Considere a situacaoD 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 sD 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 sb 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 e n c i a em memoria e comparada
Mesmo sendo instancias distintas o resultado deveria ser TRUE
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 31 / 42
Padroes de Projeto de Sistemas Empresariais
Solucao: Criar classes com o padrao objeto-valorp u b l i c c l a s s D i n h e i r o{
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 Moeda { g e t ; p r o t e c t e d s e t ; }p u b l i c d e c i m a l V a l o r { g e t ; p r o t e c t e d s e t ; }p u b l i c o v e r r i d e b o o l E q u a l s ( o b j e c t o b j ){
r e t u r n D i n h e i r o . E h I g u a l ( t h i s , o b j as D i n h e i r o ) ;}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 ){
r e t u r n D i n h e i r o . E h I g u a l ( l h s , r h s ) ;}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 ){
r e t u r n ! D i n h e i r o . E h I g u a l ( l h s , r h s ) ;}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 () Padroes de Projeto 22 de junho de 2012 32 / 42
Padroes de Projeto de Sistemas Empresariais
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 sproduto1 . Preco = p r e c o 1 ; // produto1 c u s t a 45D 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 sproduto2 . Preco = p r e c o 2 ; // produto2 c u s t a 80 e produto1 c u s t a 45 ! !
// ERRO: Objeto−v a l o r e i m u t a v e l , nao s e pode a l t e r a−l o apos a c r i a c a op r e c o 1 . V a l o r = 7 0 ; // ERRO: Gera exce c ao , nao s e pode a l t e r a r o v a l o rp r e c o 1 . Moeda = d o l a r ; // ERRO: Gera exce c ao , nao s e pode a l t e r a r a moeda
Proposito: Sao classes que representam valores imutaveis (naomudam) e cujo criterio de igualdade nao e baseado em umapropriedade Id. Logo, essas classes nao possuem Id.
Figura: Dinheiro e um Objeto-Valor, Moeda e uma Entidade
Vantagens:Permite simplificar conceitos mais complexosEvita que as referencias tenham que ser gerenciadas.
Observacao: Em .NET, um objeto tambem pode ser definido comoobjeto-valor se o seu tipo e um Struct
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 33 / 42
Padroes de Projeto de Sistemas Empresariais
Modelo Visao Controlador (Model View Controller)
Proposito: Surgiu junto com a plataforma Smalltalk e a sua ideia e aseparacao das classes de um sistema em tres papeis distintos:
Modelo: Classe nao visual com dados e comportamento. Umainformacao no sistema.Visao: Classe que representa o modelo visualmente na interface grafica.Controlador: Recebe a entrada de dados, manipula o modelo e atualizaa visao apropriadamente.
Figura: Pacotes MVC
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 34 / 42
Padroes de Projeto de Sistemas Empresariais
Modelo Visao Controlador (Model View Controller)
Vantagens:Guia a separacao de classes com papeis diferentesModelo pode ser representado visualmente de varias formasFacilita o teste de objetos nao visuais como o modelo
Figura: Exemplo de Implementacao MVCHumberto C Marchezi () Padroes de Projeto 22 de junho de 2012 35 / 42
Padroes de Projeto de Sistemas Empresariais
Modelo Visao Controlador (Model View Controller)
Modelop u b l i c c l a s s Contato{
p u b l i c Contato ( s t r i n g nome , s t r i n g e m a i l ){
Nome = nome ;Emai l = e m a i l ;
}p u b l i c l o n g I d { g e t ; p r o t e c t e d s e t ; }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 Emai l { g e t ; s e t ; }
}
Visaop u b l i c i n t e r f a c e I C a d a s t r o C o n t a t o V i e w{
l o n g I d C o n t a t o { g e t ; s e t ; }s t r i n g NomeContato { g e t ; s e t ; }s t r i n g Emai lContato { g e t ; s e t ; }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 ; }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 ; }b o o l H a b i l i t a r E m a i l C o n t a t o { s e t ; }e v e n t E v e n t H a n d l e r I n s e r i r C l i e n t e ;e v e n t E v e n t H a n d l e r N o v o C l i e n t e ;
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 36 / 42
Padroes de Projeto de Sistemas Empresariais
Modelo Visao Controlador - Controlador
p u b l i c c l a s s 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{
p r i v a t e I C a d a s t r o C o n t a t o V i e w v i s a o ;p u b l i c 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 ( I C a d a s t r o C o n t a t o V i e w v i s a o ){
v i s a o = v i s a o ;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 ) ;
}
v o i d N o v o C l i e n t e ( o b j e c t se n de r , EventArgs e ){
t h i s . v i s a o . H a b i l i t a r I d C o n t a t o = t r u e ;t h i s . v i s a o . H a b i l i t a r N o m e C o n t a t o = t r u e ;t h i s . v i s a o . H a b i l i t a r E m a i l C o n t a t o = t r u e ;t h i s . v i s a o . I d C o n t a t o = 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 . Emai lContato = s t r i n g . Empty ;
}
v o i d C l i e n t e I n s e r i d o ( o b j e c t s e nd e r , EventArgs e ){
Contato c o n t a t o = new Contato ( t h i s . v i s a o . NomeContato , t h i s . v i s a o . Emai lContato ) ;P e r s i s t e n c i a . S a l v a r ( c o n t a t o ) ;t h i s . v i s a o . H a b i l i t a r I d C o n t a t o = f a l s e ;t h i s . v i s a o . H a b i l i t a r N o m e C o n t a t o = f a l s e ;t h i s . v i s a o . H a b i l i t a r E m a i l C o n t a t o = f a l s e ;
}}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 37 / 42
Padroes de Projeto de Sistemas Empresariais
Modelo Visao Controlador (Model View Controller)
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{
p r i v a t e 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 c o n t r o l a d o r ;p u b l i c J a n C a d a s t r oC o n t a t o ( ){
I n i t i a l i z e C o m p o n e n t ( ) ;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 . Enabled = v a l u e ; } }p u b l i c b o o l 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 . t x t C o n t a t o . Enabled = v a l u e ; } }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 . Enabled = v a l u e ; } }p u b l i c l o n g I d C o n t a t o{
g e t { r e t u r n ( l o n g ) t h i s . numIdContato . Value ; }s e t { t h i s . numIdContato . Value = 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 Emai lContato{
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 e v e n t E v e n t H a n d l e r I n s e r i r C l i e n t e ;p r i v a t e v o i d b t I n c l u i r C l i c k ( o b j e c t s en d e r , EventArgs e ) { t h i s . I n s e r i r C l i e n t e ( s en d er , e ) ; }p u b l i c e v e n t E v e n t H a n d l e r N o v o C l i e n t e ;p r i v a t e v o i d b t N o v o C l i c k ( o b j e c t se n de r , EventArgs e ) { t h i s . N o v o C l i e n t e ( se n de r , e ) ; }
}Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 38 / 42
Padroes de Projeto de Sistemas Empresariais
Modelo Visao Controlador (Model View Controller)
p u b l i c p a r t i a l c l a s s WebCadastroContato : System . Web . UI . Page , I C a d a s t r o C o n t a t o V i e w{
p r i v a t e 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 c o n t r o l a d o r ;p r o t e c t e d v o i d Page Load ( o b j e c t s e nd e r , EventArgs 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 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 . t x t I d C o n t a t o . Enabled = v a l u e ; } }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 . txtNomeContato . Enabled = v a l u e ; } }p u b l i c b o o l 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 . t x t E m a i l C o n t a t o . Enabled = v a l u e ; } }p u b l i c l o n g I d C o n t a t o{
g e t { r e t u r n I n t 6 4 . Parse ( 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 . txtNomeContato . Text ; }s e t { t h i s . txtNomeContato . Text = v a l u e ; }
}p u b l i c s t r i n g Emai lContato{
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 e v e n t E v e n t H a n d l e r N o v o C l i e n t e ;p r o t e c t e d v o i d b t N o v o C o n t a t o C l i c k ( o b j e c t s e nd e r , EventArgs e ) { t h i s . N o v o C l i e n t e ( se n d er , e ) ; }p u b l i c e v e n t E v e n t H a n d l e r I n s e r i r C l i e n t e ;p r o t e c t e d v o i d 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 s e nd e r , EventArgs e ) { t h i s . I n s e r i r C l i e n t e ( s en d er , e ) ; }
}
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 39 / 42
Padroes de Projeto de Sistemas Empresariais
Exercıcio Data Table Gateway
Criar um Data Table Gateway para o sistema do exercıcio anterior
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 40 / 42
Padroes de Projeto de Sistemas Empresariais
Exercıcio MVC
Aplicacao Winforms e Webforms
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 41 / 42
Referencias
Referencias
data & object factory:http://www.dofactory.com/Patterns/Patterns.aspx
Patterns of Enterprise Application Architecture - Martin Fowler:http://martinfowler.com/eaaCatalog/
Humberto C Marchezi () Padroes de Projeto 22 de junho de 2012 42 / 42