SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
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
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
Apresenta¸˜o
                                    ca


Padr˜es de Projeto
    o




  Humberto C Marchezi ()        Padr˜es de Projeto
                                    o                22 de junho de 2012   3 / 42
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

Contenu connexe

Similaire à Padroes de desenho

Agile Brazil 2012 - Padrões Para Implantar Métodos Ágeis
Agile Brazil 2012 - Padrões Para Implantar Métodos ÁgeisAgile Brazil 2012 - Padrões Para Implantar Métodos Ágeis
Agile Brazil 2012 - Padrões Para Implantar Métodos ÁgeisSuelen Carvalho
 
Design Instrucional do Curso Virtual Auto Cad Básico
Design Instrucional do Curso Virtual Auto Cad BásicoDesign Instrucional do Curso Virtual Auto Cad Básico
Design Instrucional do Curso Virtual Auto Cad BásicoDenise Aparecida Bonfim
 
Ciência da Computação - Rumo à Engenharia de Software
Ciência da Computação - Rumo à Engenharia de SoftwareCiência da Computação - Rumo à Engenharia de Software
Ciência da Computação - Rumo à Engenharia de Softwaremarcondmarchi
 
Agile br2011 lucabastos-prog10x-noiteagilcaelum
Agile br2011 lucabastos-prog10x-noiteagilcaelumAgile br2011 lucabastos-prog10x-noiteagilcaelum
Agile br2011 lucabastos-prog10x-noiteagilcaelumLuca Bastos
 
TDC 2012 - Fishbowl conversation sobre Arquitetura
TDC 2012 - Fishbowl conversation sobre ArquiteturaTDC 2012 - Fishbowl conversation sobre Arquitetura
TDC 2012 - Fishbowl conversation sobre ArquiteturaLeandro Daniel
 
Aula 03-metodo-de-projeto-engeharia
Aula 03-metodo-de-projeto-engehariaAula 03-metodo-de-projeto-engeharia
Aula 03-metodo-de-projeto-engehariaPaulo Citrângulo
 
Agile br2011 lucabastos-prog10x
Agile br2011 lucabastos-prog10xAgile br2011 lucabastos-prog10x
Agile br2011 lucabastos-prog10xLuca Bastos
 
Ideo hcd toolkit_complete_portuguese
Ideo hcd toolkit_complete_portugueseIdeo hcd toolkit_complete_portuguese
Ideo hcd toolkit_complete_portugueseCarol Hoffmann
 
Palestra - Design de interação
Palestra - Design de interaçãoPalestra - Design de interação
Palestra - Design de interaçãoLuiz Agner
 
C.E.S.A.R - Prototipación Electronica en Diseño
C.E.S.A.R - Prototipación Electronica en DiseñoC.E.S.A.R - Prototipación Electronica en Diseño
C.E.S.A.R - Prototipación Electronica en DiseñoTiago Barros
 
Vantagens do uso do design
Vantagens do uso do designVantagens do uso do design
Vantagens do uso do designMário Barros
 
Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...
Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...
Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...Lanylldo Araujo
 
Arquitetura de Software - Uma Visão Crítica
Arquitetura de Software - Uma Visão CríticaArquitetura de Software - Uma Visão Crítica
Arquitetura de Software - Uma Visão CríticaPedro Castilho
 
Monografia douglashiura
Monografia douglashiuraMonografia douglashiura
Monografia douglashiuraDouglas Longo
 
Sobre UX e tudo o mais - User Experience, Aula 01
Sobre UX e tudo o mais - User Experience, Aula 01Sobre UX e tudo o mais - User Experience, Aula 01
Sobre UX e tudo o mais - User Experience, Aula 01Israel Lessak
 
Coordenador de projetos ( Avaliação de Projetos )
Coordenador de projetos ( Avaliação de Projetos )Coordenador de projetos ( Avaliação de Projetos )
Coordenador de projetos ( Avaliação de Projetos )Ricardo Akerman
 

Similaire à Padroes de desenho (20)

Agile Brazil 2012 - Padrões Para Implantar Métodos Ágeis
Agile Brazil 2012 - Padrões Para Implantar Métodos ÁgeisAgile Brazil 2012 - Padrões Para Implantar Métodos Ágeis
Agile Brazil 2012 - Padrões Para Implantar Métodos Ágeis
 
Design Instrucional do Curso Virtual Auto Cad Básico
Design Instrucional do Curso Virtual Auto Cad BásicoDesign Instrucional do Curso Virtual Auto Cad Básico
Design Instrucional do Curso Virtual Auto Cad Básico
 
Esboços na arquitetura de software
Esboços na arquitetura de softwareEsboços na arquitetura de software
Esboços na arquitetura de software
 
Ciência da Computação - Rumo à Engenharia de Software
Ciência da Computação - Rumo à Engenharia de SoftwareCiência da Computação - Rumo à Engenharia de Software
Ciência da Computação - Rumo à Engenharia de Software
 
Agile br2011 lucabastos-prog10x-noiteagilcaelum
Agile br2011 lucabastos-prog10x-noiteagilcaelumAgile br2011 lucabastos-prog10x-noiteagilcaelum
Agile br2011 lucabastos-prog10x-noiteagilcaelum
 
TDC 2012 - Fishbowl conversation sobre Arquitetura
TDC 2012 - Fishbowl conversation sobre ArquiteturaTDC 2012 - Fishbowl conversation sobre Arquitetura
TDC 2012 - Fishbowl conversation sobre Arquitetura
 
Gerencia de Projetos
Gerencia de ProjetosGerencia de Projetos
Gerencia de Projetos
 
Slide projeto
Slide projetoSlide projeto
Slide projeto
 
Aula 03-metodo-de-projeto-engeharia
Aula 03-metodo-de-projeto-engehariaAula 03-metodo-de-projeto-engeharia
Aula 03-metodo-de-projeto-engeharia
 
Agile br2011 lucabastos-prog10x
Agile br2011 lucabastos-prog10xAgile br2011 lucabastos-prog10x
Agile br2011 lucabastos-prog10x
 
Ideo hcd toolkit_complete_portuguese
Ideo hcd toolkit_complete_portugueseIdeo hcd toolkit_complete_portuguese
Ideo hcd toolkit_complete_portuguese
 
Design para projetos
Design para projetosDesign para projetos
Design para projetos
 
Palestra - Design de interação
Palestra - Design de interaçãoPalestra - Design de interação
Palestra - Design de interação
 
C.E.S.A.R - Prototipación Electronica en Diseño
C.E.S.A.R - Prototipación Electronica en DiseñoC.E.S.A.R - Prototipación Electronica en Diseño
C.E.S.A.R - Prototipación Electronica en Diseño
 
Vantagens do uso do design
Vantagens do uso do designVantagens do uso do design
Vantagens do uso do design
 
Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...
Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...
Seminário Mestrado em Engenharia de Computação - Disciplina Sistemas computac...
 
Arquitetura de Software - Uma Visão Crítica
Arquitetura de Software - Uma Visão CríticaArquitetura de Software - Uma Visão Crítica
Arquitetura de Software - Uma Visão Crítica
 
Monografia douglashiura
Monografia douglashiuraMonografia douglashiura
Monografia douglashiura
 
Sobre UX e tudo o mais - User Experience, Aula 01
Sobre UX e tudo o mais - User Experience, Aula 01Sobre UX e tudo o mais - User Experience, Aula 01
Sobre UX e tudo o mais - User Experience, Aula 01
 
Coordenador de projetos ( Avaliação de Projetos )
Coordenador de projetos ( Avaliação de Projetos )Coordenador de projetos ( Avaliação de Projetos )
Coordenador de projetos ( Avaliação de Projetos )
 

Plus de Humberto Marchezi

Anomaly Detection in Seasonal Time Series
Anomaly Detection in Seasonal Time SeriesAnomaly Detection in Seasonal Time Series
Anomaly Detection in Seasonal Time SeriesHumberto Marchezi
 
Building Anomaly Detections Systems
Building Anomaly Detections SystemsBuilding Anomaly Detections Systems
Building Anomaly Detections SystemsHumberto Marchezi
 
Getting Started with Machine Learning
Getting Started with Machine LearningGetting Started with Machine Learning
Getting Started with Machine LearningHumberto Marchezi
 
Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...
Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...
Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...Humberto Marchezi
 
C++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing FrameworkC++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing FrameworkHumberto Marchezi
 

Plus de Humberto Marchezi (7)

Anomaly Detection in Seasonal Time Series
Anomaly Detection in Seasonal Time SeriesAnomaly Detection in Seasonal Time Series
Anomaly Detection in Seasonal Time Series
 
Building Anomaly Detections Systems
Building Anomaly Detections SystemsBuilding Anomaly Detections Systems
Building Anomaly Detections Systems
 
Getting Started with Machine Learning
Getting Started with Machine LearningGetting Started with Machine Learning
Getting Started with Machine Learning
 
Machine Learning Basics
Machine Learning BasicsMachine Learning Basics
Machine Learning Basics
 
Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...
Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...
Um Ambiente Grafico para Desenvolvimento de Software de Controle para Robos M...
 
C++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing FrameworkC++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing Framework
 
NHibernate
NHibernateNHibernate
NHibernate
 

Padroes de desenho

  • 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