Padrões de Projeto
Por Julie Pessoa
(julie.pessoa@ccc.ufcg.edu.br)
Na edição deste mês, iremos dar uma breve explicação sobre Padrões de Projeto de Software e suas três categorias (Criação, Estrutural e Comportamental). E para exercitar teremos uma questão do ENADE 2011.

Padrões de Projeto (em inglês, Design Patterns), são combinações de classes e algoritmos associados, com propósitos comuns de projeto. Tais padrões são normalmente soluções consagradas que se baseiam nas estruturas da orientação a objetos em sua melhor forma. Nas palavras de José Carlos Marcoratti: “padrões de projetos são soluções para problemas que alguém um dia teve e resolveu aplicando um modelo que foi documentado e que você pode adaptar integralmente ou de acordo com necessidade de sua solução”.


Cada padrão de projeto descreve um problema e o cerne da sua solução, de tal forma que você possa usar essa solução mais de um milhão de vezes, sem nunca fazê-lo da mesma maneira.



São 4 os elementos importantes que definem um padrão de projeto, a saber:


  • Nome: a identificação do padrão de projeto é importante pois ele torna-se membro do vocabulário do projetista e de seus colegas;
  • Problema: descreve quando aplicar o padrão de projeto. Apresenta a classe de problemas em questão e seu contexto;
  • Solução: descreve os elementos que fazem parte do design, seus relacionamentos, responsabilidades e colaborações;
  • Consequências: os resultados e efeitos causados pela aplicação do padrão de projeto.

  • Para se descrever e catalogar um Padrão de Projeto com total completude de informações são necessários os seguintes dados:

    Nome do Pattern e Classificação Propósito Conhecido Como
    Motivação Aplicação Estrutura
    Colaborações Consequencias Implementação
    Código Exemplo Usos Conhecidos Padrões Relacionados


    Os padrões de projeto, basicamente, se dividem em 3 categorias:

    Padrões de Criação

    Padrões Estruturais

    Padrões Comportamentais


    PADRÕES DE CRIAÇÃO


    São eles:

    - Abstract Factory: permite criar uma família de objetos relacionados ou dependentes por meio de uma interface sem especificar suas classes concretas.

    - Builder: separa a construção de um objeto complexo da sua representação de modo que o mesmo processo de construção possa criar diferentes representações.

    - Factory Method: define uma interface para a criação de um objeto, deixando as subclasses decidirem que classe instanciar. Permite a uma classe postergar a instanciação de subclasses.

    - Prototype: especifica os tipos de objetos a serem criados usando uma instância protótípica e cria novos objetos copiando este protótipo.

    - Singleton: garante que uma classe tenha somente uma única instância e fornece um ponto global de acesso pra ela.


    PADRÕES ESTRUTURAIS


    São eles:

    - Adapter: converte a interface de uma classe em outra interface esperada pelos clientes. Permite que certas classes trabalhem em conjunto, pois de outra forma seria impossível por causa de suas interfaces incompatíveis.

    - Bridge: separa uma abstração da sua implementação, de modo que as duas possam variar independentemente.

    - Composite: compõe objetos em estrutura de árvore para representar hierarquias do tipo partes-todo. Permite que os clientes da estrutura tratem objetos individuais e composições de objetos de maneira uniforme.

    - Decorator: atribui responsabilidades adicionais a um objeto dinamicamente. Fornece uma alternativa flexível à utilização de subclasses para a extensão de funcionalidades.

    - Façade: fornece uma interface unificada para um conjunto de interfaces de um subsistema. Define uma interface de nível mais alto que torna o subsistema mais fácil de usar.

    - Flyweight: usa compartilhamento para suportar grandes quantidades de objetos, de granularidade fina, de maneira eficiente.

    - Proxy: fornece um objeto representante ou um marcador de outro objeto para controlar o acesso ao mesmo.


    PADRÕES COMPORTAMENTAIS


    São eles:

    - Chain of Responsibility: evita o acoplamento entre o remetente e o destinatário de uma solicitação, dando a mais de um objeto a possibilidade de tratar a solicitação.

    - Command: encapsula uma solicitação como um objeto, permitindo a parametrização de clientes com diferentes solicitações, o enfileiramento e o registro de solicitações e o suporte a operações que possam ser, por exemplo, desfeitas.

    - Interpreter: dada uma linguagem, define uma representação para sua gramática juntamente com um interpretador que usa a representação para interpretar sentenças nesta linguagem.

    - Iterator: fornece uma maneira de acessar sequencialmente os elementos de um objeto agregado sem expor sua representação subjacente.

    - Mediator: Define um objeto que encapsula a interação entre um conjunto de objetos.

    - Memento: Sem violar o encapsulamento, captura e externaliza um estado interno de um objeto, de modo que o mesmo possa posteriormente ser restaurado para este estado.

    - Observer: define uma relação de dependência 1:N de forma que quando um certo objeto (assunto) tem seu estado modificado os demais (observadores) são notificados; Possibilita baixo acoplamento entre os objetos observadores e o assunto.

    - State: permite objeto alterar seu comportamento quando estado interno muda.

    - Strategy: permite que uma família de algoritmos seja utilizada de modo independente e seletivo.

    - Template Method: define o esqueleto de um algoritmo em uma operação, postergando a definição de alguns passos para subclasses.

    - Visitor: define operações independentes a serem realizadas sobre elementos de uma estrutura.



    Let’s Practice!!!


    A questão desta edição é a 25 do ENADE 2011. Tente resolver e logo em seguida olhe a resolução mais abaixo.


    Analisando as alternativas:

    I - FALSA. Como visto, logo acima, Prototype não é um padrão Estrutural e sim de Criação.

    II - FALSA. O objetivo de Singleton é garantir que uma classe tenha uma única instância.

    III - VERDADEIRA

    IV - VERDADEIRA

    Portanto,como as alternativas III e IV estão corretas, a letra que corresponde a esse resultado é a letra E.

    Referências:

    http://brizeno.wordpress.com/padroes/

    http://www.ic.unicamp.br/~vanini/mc302/PadroesDeProjeto.pdf

    http://www.inf.ufes.br/~vitorsouza/wp-content/uploads/java-br-curso-padroesdeprojeto-slides02.pdf

    http://pt.wikipedia.org/wiki/Padr%C3%A3o_de_projeto_de_software

    http://www.macoratti.net/Default.aspx


    Jornal PETNews - Edição: Rafael Rêgo e Julie Pessoa- Revisão: Lívia Sampaio e Gleyser Guimarães
    Grupo PET Computação UFCG, 2013. All rights reserved.