Padrões de Projeto

No desenvolvimento de um sistema, espera-se alguns requisitos que sejam garantidos, como por exemplo: desempenho, robustez, compreensão, facilidade na reutilização, modificação e uso.

Os Design Patterns, também conhecidos como Padrões de Projeto, foram criados pelo arquiteto Christopher Alexander, na década de 70. Durante esse período o arquiteto escreveu dois livros: “Pattern Language” e “Timeless Way of Building”. Esses livros foram o exemplo de como Christopher pensava no modo para documentar esses padrões.

Em 1995, os profissionais: Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, escreveram e lançaram o livro chamado “Design Patterns: Elements of Reusable Object-Oriented Software”, que mostra os detalhes dos 23 Design Patterns. Por essa realização, os profissionais foram batizados com o nome “Gangue dos Quatro” (Gang of Four ou GoF).

O objetivo dos padrões de projeto, são tornar componentes reutilizáveis que facilitam a padronização, que permita agilidade para as soluções de problemas recorrentes no desenvolvimento do sistema.

Conceito de padrão
Figura 1: Conceito de padrão.

Existem dois padrões de projetos conhecidos pela engenharia de software que são: padrões GoF(Gang of Four) e os padrões GRASP (General Responsability Assignment Software Patterns).

Padrões GRASP

Ajudam a especificar, em que momento é atribuída a responsabilidade de decisão, quando se é um comportamento ou elemento ao objeto. A formação reúne nos seguintes padrões:

  • Especialista na informação;
  • Criador;
  • Controlador;
  • Acoplamento Fraco;
  • Coesão Alta;
  • Polimorfismo;
  • Invenção Pura;
  • Indireção;
  • Variações Protegidas;

Padrões GoF

Esses padrões tem como objetivo, solucionar problemas comuns de softwares que tenham algum envolvimento a orientação a objetos. São formados por três grupos exibidos abaixo:

  • Padrões de criação: Factory Method, Abstract Factory, Singleton, Builder, Prototype.
  • Padrões estruturais: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy;
  • Padrões comportamentais: Chain of Responsability, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template, Method, Visitor.

Padrões GoF de criação

Os padrões desse tipo, exigem um tratamento de como os objetos (classes) são criados, para atenderem as diversas necessidades. No Java, os objetos são instanciados através de seus construtores, porém a utilização deles fica limitada quando:

  • O código que referencia a criação de um objeto precisa conhecer os construtores dele, isso aumenta o acoplamento das classes.
  • O objeto não pode ser criado parcialmente.
  • O construtor não consegue controlar o número de instâncias presentes na aplicação.
Ilustração figurativa do Padrão GoF de criação
Figura 2: Ilustração figurativa do Padrão GoF de criação.

Factory Method - Esse padrão define uma interface para a criação de um objeto, deixando que as subclasses fiquem responsáveis por decidir qual classe instanciar.

Abstract Factory - Permite elaborar uma interface para criação de famílias de objetos relacionados ou interdependentes, que não especifica suas classes concretas. A partir desse padrão consegue-se criar fábricas concretas, que são responsáveis pela criação de novos objetos para atender as necessidades do cliente. Portanto, essa prática ajuda a excluir a dependência entre o cliente e a classe dos objetos usados por ele.

Singleton - Usado quando desejado, que uma classe tenha apenas uma instância na aplicação. Abaixo, mostra alguns aspectos que devem serem cuidados ao criar esse padrão.

  • O construtor da classe fica como privado (private), sendo que não pode ser instanciada para fora da própria classe.
  • A classe é final, pois não permite a criação de subclasses da própria classe.
  • O acesso é permitido através do método que retorna a instância única da classe, ou faz a criação de uma, caso não tenha sido criada.

Builder - Fornece uma interface genérica para a construção incremental de agregações. Esse padrão esconde os detalhes de como os componentes são criados, representados e compostos.

Prototype - Define os tipos de objetos a serem criados a partir de uma instância que funciona como um protótipo, fazendo com que novos objetos sejam criados com base nesse protótipo.

Padrões GoF Estruturais

Esse padrões descrevem os seguintes aspectos: elaboração, associação e a organização entre objetos e classes/interfaces. Permitem combinar objetos em estruturas mais complexas, ou descrever como as classes são herdadas ou compostas a partir de outras.

Ilustração figurativa do Padrão GoF Estruturais
Figura 3: Ilustração figurativa do Padrão GoF Estruturais.

Adapter - A ação desse padrão converte a interface de uma classe em outra, esperada pelo objeto cliente. Através dessa conversão, permite que classes com incompatibilidade de interfaces, consigam serem adaptadas para que outros objetos possam trabalhar juntos.

Bridge - Esse padrão separa uma abstração de sua implementação, permitindo que ambas possam variar independente, sendo estabelecida uma ponte (tradução de “bridge”) entre elas.

Composite - Compostos por objetos em árvores de agregação, fazendo que objetos agregados sejam tratados como um único objeto.

Decorator - Esse padrão busca em oferecer uma alternativa flexível para extensão de novas funcionalidades de objeto dinâmicos, sem o uso da herança. Um exemplo é o uso da Barra de Rolagem que pode ser incorporada de maneira dinâmica a uma janela, caixa de texto ou página web.

Facade - Oferece uma interface unificada para um conjunto de objetos que consistem um subsistema, definindo uma interface de alto nível que facilita no uso.

Flyweight - Utiliza o compartilhamento para dar suporte eficiente a um grande número de objetos com alto nível de granularidade. Esse padrão, cria modelos de referência para cada objeto, que concentra todas as características em comum em um objeto.

Proxy - Permite que o acesso seja controlado por meio de outro objeto, que atua como substituto. Geralmente, usado na programação orientada a aspectos, tendo como objetivo ajudar a separar, encapsular, modularizar métodos e organizar o código de acordo com a importância.

Padrões GoF Comportamentais

Esses padrões, mostram o processo de como os objetos ou classes se comunicam. Em geral, buscam um baixo acoplamento entre os objetos, apesar da comunicação que existe entre eles.

Ilustração figurativa do Padrão GoF Comportamentais
Figura 4: Ilustração figurativa do Padrão GoF Comportamentais.

Chain of Responsibility - O padrão “Cadeia de Responsabilidades” encadeia vários objetos receptores que transporta uma solicitação, sendo aguardada até que um dos objetos responda. Com isso, evita-se o acoplamento entre o remetente de uma solicitação e seu destinatário, dando oportunidade para mais de um objeto tratar a solicitação.

Saiba mais ;)

  • Curso Completo de Python:
    Neste curso de Python você aprenderá: - Operadores, estruturas condicionais, estruturas de repetição - CGI (criação de programas no lado do servidor web) - Programação orientada a objetos - Interfaces gráficas - tratamento de exceção - criação de jogos - E muitos mais.
  • Como trabalhar com listas em Python:
    Veja nesse artigo como criar e manipular dados na forma de listas na linguagem de programação Python.
  • O que é LESS?:
    Neste curso aprenderemos o que é o LESS, um pré-processador de CSS que nos permite escrever folhas de estilo usando uma sintaxe robusta, que conta com recursos como variáveis e funções, mas que é convertida posteriormente para CSS.

Command - Encapsula uma mensagem ou solicitação como um objeto, de modo que, se possa parametrizar clientes com diferente mensagens.

Interpreter

São representações para gramáticas e abstrações para análise sintática, sendo usado mais para definição de linguagem.

Iterator

Usado para prover um modo de acessar elementos de uma coleção de objetos de forma sequencial, sem exposição das suas estruturas internas.

Mediator

Tem como objetivo, desacoplar e gerenciar as colaborações entre um grupo de objetos. Esse processo acontece no momento, quando é definido um objeto que encapsula a forma de como ocorrem as interações. Portanto, tem um baixo acoplamento entre os objetos, evitando que eles se refiram uns aos outros explicitamente.

Memento - Funciona como um “snapshot”, pois captura e externaliza o estado interno de um objeto, sem violar o encapsulamento, permitindo que o objeto consiga ser restaurado a esse estado futuramente. Um exemplo disso, são em operações que precisam ser anuladas, para que o estado anterior do objeto seja depois restaurado.

Observer - Usado para sincronizar, coordenar ou manter a consistência entre objetos relacionados. Sendo que tem a dependência um para muitos entre objetos, ou seja, quando o estado de um objeto muda, todos os que dependem são notificados e atualizados automaticamente.

State - Permite que um objeto mude seu comportamento quando seu estado interno é alterado, sendo mudado a classe do objeto.

Strategy - Permite definir novas conjunto de algoritmos sem alterar as classes dos elementos sobre os quais opera.

Template Method - Adequada o esqueleto de um algoritmo em uma operação, permitindo que subclasses componham o algoritmo e tenham a possibilidade de redefinir certos passos a serem tomados no processo, sem mudá-lo.

Visitor - Representa uma operação a ser realizada sobre elementos da estrutura de um objeto, sendo permitida a criação de uma nova operação sem que mude a classe dos elementos sobre as quais é operado.

Conclusão

Nesse artigo, foi descrito como originou o “Design Pattern”, que explicou a história, formação e significados. Também mostrado os conceitos dos padrões que fazem parte dos padrões GoF (Criação, Estruturais e Comportamentais).

Links Úteis

  • Introdução à Computação Serverless com Azure e .NET:
    Esse artigo é útil para quem deseja adentrar no mundo da computação serverless. Conheça uma das mais novas e promissoras áreas da computação que visa prover a execução de rotinas de software rápidas e baratas na nuvem, alocando o mínimo de recursos possíveis se, e somente se, requisições forem solicitadas ao servidor.
  • Um Bate-papo sobre Angular:
    Angular é um framework para criação de aplicações cliente baseadas em HTML, que serão executadas no navegador ou em dispositivos móveis, recebendo dados através da internet. Ficou curioso? Então saiba mais sobre o Angular neste DevCast.
  • Segurança de web services em Java com controle de acesso:
    Neste curso vamos aprender a programar um mecanismo de autorização para controle de acesso às diferentes funcionalidades oferecidas por uma Web API RESTful, configurando para três tipos de usuário (cliente, funcionário e administrador) diferentes tipos de permissão.

Saiba mais sobre Java ;)

  • Padrões de Projeto em Java:
    Neste guia de consulta você encontrará diversos conteúdos sobre padrões de projeto e arquitetura e como aplicá-los em suas aplicações Java, tais como os padrões GoF e Refactoring.
  • JavaServer Faces:
    Neste Guia de Referência você encontrará todo o conteúdo que precisa para conhecer o JSF, especificação Java que traz conceitos do padrão MVC e que facilita a construção de interfaces web utilizando componentes.
  • Carreira Programador Java:
    Aprender Java não é uma tarefa simples, mas seguindo a ordem proposta nesse Guia, você evitará muitas confusões e perdas de tempo no seu aprendizado. Vem aprender java de verdade, vem!