Design Patterns O que é padrão? V: 1.1
Agenda Histórico Conceito Vários Patterns :-) Anti-Patterns :-(
História A origem dos Design Patterns (Padrões de Desenho) vem do trabalho de um arquiteto chamado Christopher Alexander, no final da década de 70. Ele escreveu dois livros, inicialmente, A Pattern Language [Alex77] e A Timeless Way of Building [Alex79], nos quais ele exemplificava o uso e descrevia seu raciocínio para documentar os padrões. Objetiva auxiliar o desenho de construções e cidades.
História Os patterns de Alexander procuravam prover uma fonte de  idéias provadas  para indivíduos e comunidades para serem usadas em construções, mostrando assim o quanto belo, confortável e flexível os ambientes podem ser construídos :-).
História (agora em sofware) Em 1995, um grupo de quatro profissionais escreveu e lançou o livro "Design Patterns: Elements of Reusable Object-Oriented Software" [Gamma95], um catálogo com 23 padrões de desenho (design patterns). Os autores: Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Mais conhecidos como A Gangue dos Quatro (Gang Of Four ou GoF). Considerados os maiores entusiastas dos Design Patterns.
Conceitos Um Pattern descreve uma solução comprovada para um problema de desenho recorrente, dando ênfase particular no contexto e forçando a aproximação do problema, e as conseqüências e o impacto de sua solução.
Conceitos Uma coleção de padrões de desenho de software, que são soluções para problemas conhecidos e recorrentes no desenvolvimento de software.
Conceitos Ato de capturar idéias como um padrão. Ou simplesmente: Solução padrão para um problema recorrente.
Vantagens Eles foram provados. Os padrões refletem a experiência, conhecimento e soluções dos desenvolvedores que tiveram sucesso usando esses padrões em seus trabalhos. São reusáveis. Os padrões provêem uma solução pronta que pode ser aplicada à diferentes problemas. São expressíveis. Os padrões provêem um vocabulário comum de soluções que podem expressar muitas soluções, sucintamente.
Anatomia de um Pattern (forma Alexandrina) Contexto Uma ou duas sentenças que descreve o contexto de aplicação do pattern. Problema: Uma questão que ilustra o problema. Forças (motivação): Forças atuantes que requerem a solução. Apresenta a necessidade do pattern Solução: Uma ou duas sentenças que introduz a solução Descrição da Solução: Descrição detalhada.
Meu Primeiro Pattern :-) Precisamos desenvolver um sistema que possui como uma das classes, o SuperHomem. Sabemos que ele é a última instância da classe Kryptoniano. (Esqueçam o General Zod por enquanto :-)). Os demais que aparecem nos quadrinhos são clones (aí é outro pattern (prototype)).
O Problema: Criar uma classe que poderá possuir apenas uma única instância. Isso é um problema recorrente? Religiões monoteístas tem apenas um deus. Sistemas de informação tem apenas uma configuração por site. Carro tem apenas um motor. Chester tem apenas um. Usem sua imaginação...
Pattern Singleton Vamos ao código. (hands-on)
Design-Patterns (GoF)
Design-Patterns (GoF) Criacional Classes ou métodos construtores. Patterns: Singleton Builder Abstract Factory Factory Method Prototype
Design-Patterns (GoF) Comportamental Define maneira de delegar responsabilidade pelas decisões para outro objeto. Patterns: Chain of Responsability Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor
Design-Patterns (GoF) Estrutural Onde um problema é resolvido através de uma estrutura de objetos. Patterns: Adapter Bridge Composite Decorator Façade Flyweight Proxy
Regras Gerais Grande valor dado às Interfaces. Aumenta a abstração e o 'Grau de Incerteza'. Preferência à composição invés da herança. Permite várias estruturas. Maior Flexibilidade.
Programando contra Interfaces Conheça o protocolo (conjunto de métodos), não conheça a classe. Ex: JDBC
Singleton Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto. Curiosidade: O termo vem do significado em inglês quando se resta apenas uma carta nas mãos
Factory Method Define uma interface para criar um objeto, mas deixa as subclasses decidir qual classe será instanciada. Define um construtor “virtual”. O operador  new  é considerado perigoso.
Factory Method
Factory Method
Prototype Especifica o tipo de objeto a ser criado com base de uma instância protótipo. Cria cópias de um objeto. O operador  new  é considerado perigoso.
Prototype
Prototype
Chain of Responsability Evita o acoplamento do remetente de uma solicitação ao seu receptor, ao dar a mais de um objeto a oportunidade de tratar a solicitação. Encadear os objetos receptores, passando a solicitação ao longo da cadeia até que um objeto a trate.
Chain of Responsability
Chain of Responsability
Command Encapsular uma solicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações, enfileirar ou fazer o registro (log) de solicitações e suportar operações que podem ser desfeitas.  Também conhecido como Action ou Transaction.
Command
Command
Interpreter Usado para definição de linguagem. Define representações para gramáticas e abstrações para análise sintática. Executa (eval) uma instrução em linguagem diferente.
Interpreter
Interpreter
Iterator permite a "iteração" e um modo de acesso a elementos de um agregado de objetos, seqüencialmente, sem exposição das estruturas internas.
Iterator
Iterator
Observer Define uma dependência um-para-muitos entre objetos de modo que quando um objeto muda o estado, todos seus dependentes sejam notificados e atualizados automaticamente. Permite que objetos interessados sejam avisados da mudança de estado ou outros eventos ocorrendo num outro objeto.
Observer
Observer
State O padrão de desenho state é usado para permitir que um objeto altere o seu comportamento quando o seu estado muda.  Ao utilizar este padrão, parecerá que o objeto mudou de classe. Usa um objeto como estado.
State
State
Template Method Define o esqueleto de um algoritmo numa operação, passando alguns passos para as subclasses.  Permite que a subclasse mude certos passos sem mudar a estrutura do algoritmo. A classe base declara “placeholders” do algoritmo e as subclasses preenchem esses “placeholders”.
Template Method
Template Method
Composite Composite é um padrão de projeto de software utilizado para representar estruturas de objetos agrupados hierarquicamente.  Através deste padrão é possível enxergar uma "composição" de objetos como se fosse um objeto individual.
Composite
Composite
Decorator Anexa responsabilidades adicionais a um objeto dinamicamente. Provê um alternativa flexível às subclasses extendendo a funcionalidade. Amplia a funcionalidade através da composição.
Decorator
Decorator
Façade Em padrões de projeto de software, um façade é um objeto que disponibiliza uma interface para uma grande quantidade de funcionalidades de uma API, por exemplo. Reduz as dependências em relação às características internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do sistema
Façade
Façade
Flyweight Flyweight é uma padrão de projeto de software que define como compartilhar objetos para que os mesmos possam ser usados em vários locais ao mesmo tempo, sendo assim, um Flyweight atua independentemente em cada local. Similar à um pool.
Flyweight
Flyweight
Outros Patterns Não só de GoF vive o projeto
MVC Model View Controller ou Modelo-Visão-Controlador é um padrão de arquitetura de aplicações que visa separar a lógica da aplicação (Model), da interface do usuário (View) e do fluxo da aplicação (Controller).  Permite que a mesma lógica de negócios possa ser acessada e visualizada por várias interfaces.
MVC
Modelo Implementa o modelo representando a estrutura de baixo nivel do projeto, podendo ser o modelo objeto-relacional que implementa a camada de dados, e ou num caso de MVC de Interface poderia guardar informações de estado dos controles.
Controller Implementa a camada respónsavel pelo gerenciamentos de eventos no projeto, tais como cliques do usuario, chamando a camada Model para processar os eventos, tambem pode manter informações de estado do usuario na aplicação.
View Gera a interface com usuário de modo que esta somente requisite o processamento de eventos pelo Controller.
MVC Para uma implemetação correta, as camadas Model, Controller e View devem ser implementadas de forma que a inversão da ordem não acarrete problemas por dependência, ou seja, a camada de interface (View) depende de controle (Controller) que acessa um Modelo (Model), mas nunca o inverso.
DAO Data Access Object é um componente de software que provê uma interface comum entre a aplicação e um ou mais dispositivos de armazenamento.
ValueObject Alguns métodos expostos por componentes de negócio retornam dados para o cliente. E as vezes são feitas várias chamadas para pegar todos os valores, e com o VO, uma única chamada de método é usada para enviar e recuperar um VO. O objeto de negócio pode construir o VO, preencher seus atributos e passá-lo para o cliente.
ValueObject
IoC (Dependency Injection) Inversion of Control (IoC) é o nome dado ao padrão de desenvolvimento de programas de computadores onde a seqüência (controle) de chamadas dos métodos não é determinada pelo programador. Este controle é delegado a uma infraestrutura de software muitas vezes chamada de container. Esta é uma característica comum aos frameworks. http://www.javafree.org/content/view.jf?idContent=1
Make it run, make it right, make it fast, make it small Define a ordem e o momento da otimização de código e performance. Faça Rodar. Faça Rodar Corretamente. Faça Rodar Rápido. Faça Rodar com menos Código. “Premature optimization is the root of all evil.” - Tony Hoare
Anti-Patterns Sempre haverá o lado negro
Anti-Patterns Inspirados nos Design Patterns. Solução padrão que provê benefícios em curto prazo. Os problemas futuros sobrepõe os benefícios imediatos. Dificultam a manutenção.
Copy and Paste Programming É um estilo informal de programação que simplesmente copia códigos de um programa para outro. O termo vem de uma atividade comum no uso de computadores: Copiar e Colar.
The Golden Hammer Uso excessivo ou obsessivo de uma tecnologia ou ferramenta leva ao Golden Hammer. Equipes ou indivíduos com conhecimento numa tecnologia particular tende a usar esse mesmo conhecimento em outros projetos onde outra tecnologia seria mais adequada. Quando a única ferramenta que se tem é um martelo, tudo lhe parece um prego.
Reinventing the Wheel Este não precisa de nenhuma explicação. :-b Derivação: Reinventing the square wheel Chegar a primeira versão de uma solução já existente.
Busy waiting/Spinning Busy waiting ou spinnig é uma técnica onde um processo checa repetidas vezes verificando se uma condição é verdadeira. Um loop infinito que desperdiça tempo da cpu para avaliar se existe algo a executar. As vezes utilizado para criar uma pausa na execução de um programa.
Onde encontrar mais Anti-Patterns? http://en.wikipedia.org/wiki/Anti-patterns E tem muitos? Sim, um montão deles :-)
Agradecimentos Ao agradecimento especial ao Wikipedia, e a Vince Hustom que criou o melhor site sobre patterns que já conheci. Sem eles, não teria terminado isso a tempo.

Design Patterns

  • 1.
    Design Patterns Oque é padrão? V: 1.1
  • 2.
    Agenda Histórico ConceitoVários Patterns :-) Anti-Patterns :-(
  • 3.
    História A origemdos Design Patterns (Padrões de Desenho) vem do trabalho de um arquiteto chamado Christopher Alexander, no final da década de 70. Ele escreveu dois livros, inicialmente, A Pattern Language [Alex77] e A Timeless Way of Building [Alex79], nos quais ele exemplificava o uso e descrevia seu raciocínio para documentar os padrões. Objetiva auxiliar o desenho de construções e cidades.
  • 4.
    História Os patternsde Alexander procuravam prover uma fonte de idéias provadas para indivíduos e comunidades para serem usadas em construções, mostrando assim o quanto belo, confortável e flexível os ambientes podem ser construídos :-).
  • 5.
    História (agora emsofware) Em 1995, um grupo de quatro profissionais escreveu e lançou o livro "Design Patterns: Elements of Reusable Object-Oriented Software" [Gamma95], um catálogo com 23 padrões de desenho (design patterns). Os autores: Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Mais conhecidos como A Gangue dos Quatro (Gang Of Four ou GoF). Considerados os maiores entusiastas dos Design Patterns.
  • 6.
    Conceitos Um Patterndescreve uma solução comprovada para um problema de desenho recorrente, dando ênfase particular no contexto e forçando a aproximação do problema, e as conseqüências e o impacto de sua solução.
  • 7.
    Conceitos Uma coleçãode padrões de desenho de software, que são soluções para problemas conhecidos e recorrentes no desenvolvimento de software.
  • 8.
    Conceitos Ato decapturar idéias como um padrão. Ou simplesmente: Solução padrão para um problema recorrente.
  • 9.
    Vantagens Eles foramprovados. Os padrões refletem a experiência, conhecimento e soluções dos desenvolvedores que tiveram sucesso usando esses padrões em seus trabalhos. São reusáveis. Os padrões provêem uma solução pronta que pode ser aplicada à diferentes problemas. São expressíveis. Os padrões provêem um vocabulário comum de soluções que podem expressar muitas soluções, sucintamente.
  • 10.
    Anatomia de umPattern (forma Alexandrina) Contexto Uma ou duas sentenças que descreve o contexto de aplicação do pattern. Problema: Uma questão que ilustra o problema. Forças (motivação): Forças atuantes que requerem a solução. Apresenta a necessidade do pattern Solução: Uma ou duas sentenças que introduz a solução Descrição da Solução: Descrição detalhada.
  • 11.
    Meu Primeiro Pattern:-) Precisamos desenvolver um sistema que possui como uma das classes, o SuperHomem. Sabemos que ele é a última instância da classe Kryptoniano. (Esqueçam o General Zod por enquanto :-)). Os demais que aparecem nos quadrinhos são clones (aí é outro pattern (prototype)).
  • 12.
    O Problema: Criaruma classe que poderá possuir apenas uma única instância. Isso é um problema recorrente? Religiões monoteístas tem apenas um deus. Sistemas de informação tem apenas uma configuração por site. Carro tem apenas um motor. Chester tem apenas um. Usem sua imaginação...
  • 13.
    Pattern Singleton Vamosao código. (hands-on)
  • 14.
  • 15.
    Design-Patterns (GoF) CriacionalClasses ou métodos construtores. Patterns: Singleton Builder Abstract Factory Factory Method Prototype
  • 16.
    Design-Patterns (GoF) ComportamentalDefine maneira de delegar responsabilidade pelas decisões para outro objeto. Patterns: Chain of Responsability Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor
  • 17.
    Design-Patterns (GoF) EstruturalOnde um problema é resolvido através de uma estrutura de objetos. Patterns: Adapter Bridge Composite Decorator Façade Flyweight Proxy
  • 18.
    Regras Gerais Grandevalor dado às Interfaces. Aumenta a abstração e o 'Grau de Incerteza'. Preferência à composição invés da herança. Permite várias estruturas. Maior Flexibilidade.
  • 19.
    Programando contra InterfacesConheça o protocolo (conjunto de métodos), não conheça a classe. Ex: JDBC
  • 20.
    Singleton Este padrãogarante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto. Curiosidade: O termo vem do significado em inglês quando se resta apenas uma carta nas mãos
  • 21.
    Factory Method Defineuma interface para criar um objeto, mas deixa as subclasses decidir qual classe será instanciada. Define um construtor “virtual”. O operador new é considerado perigoso.
  • 22.
  • 23.
  • 24.
    Prototype Especifica otipo de objeto a ser criado com base de uma instância protótipo. Cria cópias de um objeto. O operador new é considerado perigoso.
  • 25.
  • 26.
  • 27.
    Chain of ResponsabilityEvita o acoplamento do remetente de uma solicitação ao seu receptor, ao dar a mais de um objeto a oportunidade de tratar a solicitação. Encadear os objetos receptores, passando a solicitação ao longo da cadeia até que um objeto a trate.
  • 28.
  • 29.
  • 30.
    Command Encapsular umasolicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações, enfileirar ou fazer o registro (log) de solicitações e suportar operações que podem ser desfeitas. Também conhecido como Action ou Transaction.
  • 31.
  • 32.
  • 33.
    Interpreter Usado paradefinição de linguagem. Define representações para gramáticas e abstrações para análise sintática. Executa (eval) uma instrução em linguagem diferente.
  • 34.
  • 35.
  • 36.
    Iterator permite a"iteração" e um modo de acesso a elementos de um agregado de objetos, seqüencialmente, sem exposição das estruturas internas.
  • 37.
  • 38.
  • 39.
    Observer Define umadependência um-para-muitos entre objetos de modo que quando um objeto muda o estado, todos seus dependentes sejam notificados e atualizados automaticamente. Permite que objetos interessados sejam avisados da mudança de estado ou outros eventos ocorrendo num outro objeto.
  • 40.
  • 41.
  • 42.
    State O padrãode desenho state é usado para permitir que um objeto altere o seu comportamento quando o seu estado muda. Ao utilizar este padrão, parecerá que o objeto mudou de classe. Usa um objeto como estado.
  • 43.
  • 44.
  • 45.
    Template Method Defineo esqueleto de um algoritmo numa operação, passando alguns passos para as subclasses. Permite que a subclasse mude certos passos sem mudar a estrutura do algoritmo. A classe base declara “placeholders” do algoritmo e as subclasses preenchem esses “placeholders”.
  • 46.
  • 47.
  • 48.
    Composite Composite éum padrão de projeto de software utilizado para representar estruturas de objetos agrupados hierarquicamente. Através deste padrão é possível enxergar uma "composição" de objetos como se fosse um objeto individual.
  • 49.
  • 50.
  • 51.
    Decorator Anexa responsabilidadesadicionais a um objeto dinamicamente. Provê um alternativa flexível às subclasses extendendo a funcionalidade. Amplia a funcionalidade através da composição.
  • 52.
  • 53.
  • 54.
    Façade Em padrõesde projeto de software, um façade é um objeto que disponibiliza uma interface para uma grande quantidade de funcionalidades de uma API, por exemplo. Reduz as dependências em relação às características internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do sistema
  • 55.
  • 56.
  • 57.
    Flyweight Flyweight éuma padrão de projeto de software que define como compartilhar objetos para que os mesmos possam ser usados em vários locais ao mesmo tempo, sendo assim, um Flyweight atua independentemente em cada local. Similar à um pool.
  • 58.
  • 59.
  • 60.
    Outros Patterns Nãosó de GoF vive o projeto
  • 61.
    MVC Model ViewController ou Modelo-Visão-Controlador é um padrão de arquitetura de aplicações que visa separar a lógica da aplicação (Model), da interface do usuário (View) e do fluxo da aplicação (Controller). Permite que a mesma lógica de negócios possa ser acessada e visualizada por várias interfaces.
  • 62.
  • 63.
    Modelo Implementa omodelo representando a estrutura de baixo nivel do projeto, podendo ser o modelo objeto-relacional que implementa a camada de dados, e ou num caso de MVC de Interface poderia guardar informações de estado dos controles.
  • 64.
    Controller Implementa acamada respónsavel pelo gerenciamentos de eventos no projeto, tais como cliques do usuario, chamando a camada Model para processar os eventos, tambem pode manter informações de estado do usuario na aplicação.
  • 65.
    View Gera ainterface com usuário de modo que esta somente requisite o processamento de eventos pelo Controller.
  • 66.
    MVC Para umaimplemetação correta, as camadas Model, Controller e View devem ser implementadas de forma que a inversão da ordem não acarrete problemas por dependência, ou seja, a camada de interface (View) depende de controle (Controller) que acessa um Modelo (Model), mas nunca o inverso.
  • 67.
    DAO Data AccessObject é um componente de software que provê uma interface comum entre a aplicação e um ou mais dispositivos de armazenamento.
  • 68.
    ValueObject Alguns métodosexpostos por componentes de negócio retornam dados para o cliente. E as vezes são feitas várias chamadas para pegar todos os valores, e com o VO, uma única chamada de método é usada para enviar e recuperar um VO. O objeto de negócio pode construir o VO, preencher seus atributos e passá-lo para o cliente.
  • 69.
  • 70.
    IoC (Dependency Injection)Inversion of Control (IoC) é o nome dado ao padrão de desenvolvimento de programas de computadores onde a seqüência (controle) de chamadas dos métodos não é determinada pelo programador. Este controle é delegado a uma infraestrutura de software muitas vezes chamada de container. Esta é uma característica comum aos frameworks. http://www.javafree.org/content/view.jf?idContent=1
  • 71.
    Make it run,make it right, make it fast, make it small Define a ordem e o momento da otimização de código e performance. Faça Rodar. Faça Rodar Corretamente. Faça Rodar Rápido. Faça Rodar com menos Código. “Premature optimization is the root of all evil.” - Tony Hoare
  • 72.
  • 73.
    Anti-Patterns Inspirados nosDesign Patterns. Solução padrão que provê benefícios em curto prazo. Os problemas futuros sobrepõe os benefícios imediatos. Dificultam a manutenção.
  • 74.
    Copy and PasteProgramming É um estilo informal de programação que simplesmente copia códigos de um programa para outro. O termo vem de uma atividade comum no uso de computadores: Copiar e Colar.
  • 75.
    The Golden HammerUso excessivo ou obsessivo de uma tecnologia ou ferramenta leva ao Golden Hammer. Equipes ou indivíduos com conhecimento numa tecnologia particular tende a usar esse mesmo conhecimento em outros projetos onde outra tecnologia seria mais adequada. Quando a única ferramenta que se tem é um martelo, tudo lhe parece um prego.
  • 76.
    Reinventing the WheelEste não precisa de nenhuma explicação. :-b Derivação: Reinventing the square wheel Chegar a primeira versão de uma solução já existente.
  • 77.
    Busy waiting/Spinning Busywaiting ou spinnig é uma técnica onde um processo checa repetidas vezes verificando se uma condição é verdadeira. Um loop infinito que desperdiça tempo da cpu para avaliar se existe algo a executar. As vezes utilizado para criar uma pausa na execução de um programa.
  • 78.
    Onde encontrar maisAnti-Patterns? http://en.wikipedia.org/wiki/Anti-patterns E tem muitos? Sim, um montão deles :-)
  • 79.
    Agradecimentos Ao agradecimentoespecial ao Wikipedia, e a Vince Hustom que criou o melhor site sobre patterns que já conheci. Sem eles, não teria terminado isso a tempo.