Artigo

Engenharia de Software em Destaque: Padrões de Projeto

Introdução

Para retomar a nossa série especial de temas sobre Engenharia de Software, uma das disciplinas de Tecnologia da Informação mais cobradas em provas de concursos, escolhemos falar hoje de padrões de projeto.

Antes de mais nada, padrões de projeto é um tópico que confunde muito os candidatos. Por ser um assunto técnico, ele pode ser aprofundado com tranquilidade pelas bancas para derrubar os candidatos (calma, pois nem sempre isso ocorre).

O nosso desafio de hoje é simplificá-lo para facilitar o seu aprendizado, mesmo que você não seja da área de TI. Você vai perceber que padrões de projeto são um pouco “decoreba”, mas vai conseguir entender o porquê das coisas. Veja como as seções estão organizadas:

  • Objetivo
  • Padrões de Projeto Criacionais
  • Padrões de Projeto Estruturais
  • Padrões de Projeto Comportamentais
  • Mapa Mental

A publicação destina-se a todos os concurseiros de alto nível de TI e da área Fiscal, de acordo com o histórico que temos das bancas. Contudo, sempre recomendamos que você confirme a cobrança no conteúdo programático do seu edital, a fim de evitar surpresas ou perder tempo desnecessariamente.

Para compreender padrões de projeto, é recomendável que você possua algumas noções de orientação a objetos. Caso você ainda não tenha visto esse assunto, sugerimos que você estude o material do Estratégia Concursos e retorne a este artigo quando estiver preparado.

A leitura de hoje será bem objetiva, de modo que seja possível concluir de uma só vez. Contudo, caso não disponha de tempo suficiente, você pode dividi-la em 2 partes, sem prejuízo nenhum. Podemos começar então?

Tempo de leitura aproximada: 15 a 20 minutos

Objetivo

Primeiramente, os padrões de projeto são um conjunto de soluções conhecidas para problemas comuns no desenvolvimento de software. Em outras palavras, você uniformiza uma maneira para resolver determinado problema (sempre que surgir o problema X, vou fazer Y).

Observe que padrões de projeto estão intimamente ligados ao conceito de reaproveitamento, cada vez mais necessário em grandes projetos de sistemas. Por conseguinte, a manutenção da solução tende a ser mais simples, reduzindo os custos da demanda.

Existem 2 conjuntos de padrões de projeto: Gang of Four (GoF) e General Responsibility Assignment Software Patterns (GRASP). No mundo dos concursos, o conjunto mais cobrado (diga-se de passagem, disparado) é o GoF. Por conseguinte, ele será o foco do nosso artigo.

O GoF divide os padrões de projeto em 3 grupos: criacionais, estruturais e comportamentais. Se você estiver vendo esse assunto pela primeira vez, irá reparar que todos eles são em inglês. Nesse caso, conhecer o idioma pode ajudar na memorização.

Padrões de Projeto Criacionais

Estes padrões auxiliam a criação de objetos. São eles: abstract factory, builder, factory method, prototype e singleton. Vamos falar um pouco sobre cada um.

Padrões de Projeto Abstract Factory e Builder

Abstract Factory: fornece uma interface para criação de famílias de objetos relacionados ou dependentes, sem especificar as suas classes concretas.

Suponha que você tenha uma interface para definir o professor, que seria uma espécie de generalização, e tenha intenção de criar objetos associados a ele, conforme a atuação dos docentes (professor de artigo, professor de videoaula, professor de pdf etc.). As subclasses teriam os mesmos métodos da classe que representa o professor, com implementações diferentes.

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

O que é complexo para você? Elaborar uma trilha estratégica é complexo? Provavelmente sim, pois envolve muitas ações. Veja que neste caso poderia aplicar o padrão builder para simplificar a construção.

Na prática, a trilha seria dividida em várias classes, cada uma delas responsável por implementar um pedaço da trilha. Pense que nós vamos dividir para conquistar.

Padrões de Projeto Factory Method, Prototype e Singleton

Factory Method: define uma interface para criar objetos, mas permite que as subclasses decidam qual classe irão instanciar.

A aula que você assiste no Estratégia pode possuir diversos formatos: vídeo, pdf, áudios etc. Quem decide o formato é o aluno, conforme as várias possibilidades apresentadas.

Por meio do factory method, é possível representar uma classe aula e subclasses, que seriam as suas especificações. A escolha do aluno determinará a criação da instância.

Veja que esse padrão parece com o abstract factory, o que confunde bastante. Atente para as definições, pois as bancas sempre fazem pegadinhas com isso.

Prototype: fornece um protótipo para a construção de objetos.

Esse padrão é um pouco mais fácil de entender. O prototype serve para clonar objetos. Um ambiente de teste do Estratégia, por exemplo, é uma cópia do ambiente de produção real, onde os alunos estudam. Sempre que precisarmos criar réplicas, vamos utilizar esse padrão.  

Singleton: garante que uma classe específica só possua uma única instância, a qual é acessível de forma global e uniforme.

Assim como o prototype, o singleton é bem conhecido e utilizado. Normalmente, define-se uma classe com o intuito de permitir a criação de vários objetos. O singleton é um padrão para amarrar que a classe tenha apenas um único objeto, uma única instância.

Suponha que o Estratégia restrinja o sistema para que os alunos não consigam fazer mais de um login simultaneamente. Ou seja, você não poderia estar logado no celular e no desktop para estudar o conteúdo. Esta seria uma aplicação do singleton.

Padrões de Projeto Estruturais

Estes padrões buscam adaptações em objetos e classes, a fim de formar estruturas maiores. São eles: adapter, bridge, composite, decorator, façade, flyweight e proxy. Vamos falar um pouco sobre cada um.

Padrões de Projeto Adapter e Bridge

Adapter: converte a interface de uma classe por outra.

Você já reparou que os nossos artigos contam com um recurso de áudio, bem no início da publicação? Se não reparou ainda, então corra lá para conferir (mas não demore, pois você está estudando e nós estamos de olho).

Este recurso é uma conversão automática do texto que está na publicação. Veja que conversões, adaptações desta natureza podem ser feitas com o padrão adapter.

Bridge: desacopla a interface de sua implementação, ocultando detalhes.

Este padrão está intimamente ligado a uma questão de organização. Nós vamos separar a abstração e a implementação em classes diferentes. Imagine que a aula seja a sua abstração.

É possível assisti-la de várias maneiras diferentes (por exemplo, vídeo ou pdf). Cada uma dessas maneiras seria uma instância da sua classe de implementação.

Padrões de Projeto Composite e Decorator

Composite: monta objetos em estruturas de árvore, em que tanto as folhas (objetos individuais) quanto os demais (grupos de objetos) sejam tratados uniformemente.

O composite lembra a árvore. Você já deve ter ouvido falar em árvore, pois estuda conosco. Sim, é disso que estamos falando. A plataforma do Estratégia organiza assuntos e aulas em estruturas de árvores.

Pense em cada um dos nós da árvore como se fossem objetos. O composite facilitará o tratamento desses objetos. Se você souber disso, já conseguirá acertar muitas questões.

Decorator: atribui responsabilidades adicionais a um objeto, de forma dinâmica.

Esse padrão oferece uma alternativa à herança tradicional, trabalhando com agregação e composição. Adicionam-se novos comportamentos aos objetos, utilizando classes separadas. E essa adição é feita em tempo de execução.

O exemplo tradicional desse assunto envolve janelas dos programas. Você já reparou que pode aparecer uma barra de rolagem quando você abre um arquivo pdf? Esse recurso pode ser proporcionado com o uso do decorator

Padrões de Projeto Façade, Flyweight e Proxy

Façade: oferece uma interface simplificada para um subsistema, tornando-o mais fácil de usar.

Para entender o façade, pense na Área do Aluno do Estratégia. Você consegue acessar diversos cursos e funcionalidades por meio de uma única porta de entrada. Ao logar no sistema, você terá acesso aos pdfs, vídeos, áudios etc. O façade unifica a interface para acessar o ambiente.

Flyweight: cria uma estrutura de compartilhamento de objetos pequenos, economizando memória.

Este padrão é muito utilizado quando há limitações de recursos. Se você possui informações semelhantes, é possível condensá-las em único objeto, a fim de economizar memória. Fique tranquilo, pois as bancas não costumam aprofundar muito este padrão.

Pense no Youtube. Caso queira visualizar as gravações de um dia todo do Estratégia, ao vivo na plataforma, você irá abrir o Youtube várias vezes? Provavelmente não. Você abrirá a aplicação uma vez e assistirá quantos vídeos quiser com o mesmo programa aberto. Eficiência de recursos.

Proxy: fornece um substituto para outro objeto controlar seu acesso.

Para entender este padrão, pense em um procurador. Se você não puder tomar posse no seu concurso em que foi aprovado, por qualquer motivo, provavelmente você irá mandar um procurador no seu lugar.

O procurador é alguém que irá substitui-lo legalmente. Esse conceito parece bastante com o proxy. Este padrão cria um intermediário para estabelecer a comunicação com o objeto original.

Padrões de Projeto Comportamentais

Estes padrões focam em algoritmos e responsabilidades dos objetos. São eles: chain of responsability, command, interpreter, iterator, mediator, memento, observer, state, strategy, template method e visitor. Vamos falar um pouco sobre cada um.

Padrões de Projeto Chain of Responsibility e Command

Chain of Responsibility: utiliza a ideia de baixo acoplamento para permitir que outros objetos da cadeia tenham a oportunidade de tratar uma solicitação.

De forma simples, o chain of responsibility é um padrão que trabalha com corrente. Pense em uma série de objetos encadeados. Eles decidirão se irão atender à solicitação ou se irão passá-la adiante para o próximo objeto da corrente (e por aí vai).

Vamos dar um exemplo simples. Suponha que você ligou para o Estratégia e descobriu que o sistema funciona com URA (Unidade de Resposta Audível). Para comprar pacotes, disque 0; para comprar assinaturas, disque 1…

Ao escolher 0 (você vai comprar um pacote), você percebe que há outras subopções ali dentro (pacotes de TI, pacotes fiscais etc.). A escolha do dígito irá determinar a equipe que vai atender você (TI ou fiscais, por exemplo).

Command: encapsula uma solicitação como um objeto, o que lhe permite parametrizar outros objetos com diferentes solicitações.

A palavra-chave desse padrão é parâmetro. O command permite que um parâmetro escolhido possa desencadear uma escolha. Vamos dar mais um exemplo para facilitar a sua vida.

Você já reparou que a Área do Aluno conta com várias opções? Você pode baixar material, pode imprimi-lo etc. Cada um desses ícones é um parâmetro a ser chamado por você, que desencadeia uma ação.

Padrões de Projeto Interpreter e Iterator

Interpreter: define uma representação para sua gramática juntamente com um interpretador, que traduz sentenças na língua.

Esse padrão é mais técnico e está associado diretamente com compiladores. Os códigos-fontes seguem uma linguagem de programação, que é interpretada / compilada nos ambientes para funcionar. O interpreter cuida disso.

Um exemplo prático do dia a dia é o corretor ortográfico do Microsoft Word. Ele traduz o que você escreve para verificar se o texto segue a gramática da língua portuguesa. Observe que é um tipo de interpretação.

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

Este padrão é muito utilizado com estruturas de dados, tais como fila, pilha etc. Imagine que você tenha um objeto fila e precise acessar seus elementos. Esse acesso sequencial poderá ser feito pelo padrão iterator.

O conceito de fila é o mesmo do mundo real (fila de banco, fila de caixa do mercado etc.). Se você entrar em contato com o Estratégia pelo chat, provavelmente irá entrar em uma fila. Quem está esperando há mais tempo é atendido primeiro; quem chega, entra no final da fila.

Padrões de Projeto Mediator e Memento

Mediator: cria um objeto que age como um mediador, controlando a interação entre um conjunto de objetos.

Neste padrão, você cria um objeto intermediário para estabelecer a comunicação com outros objetos. Ele vai mediar a interação (por isso, o nome mediator).

Cuidado para não confundir o padrão mediator com o padrão proxy. No caso do proxy, os demais objetos acham que estão lidando com o original. No caso do mediator, eles sabem que é um outro objeto intermediário que estabelece a comunicação. Mas as bancas nunca cobraram isso.

Memento: armazena o estado interno de um objeto em um determinado momento, para que seja possível retorná-lo a esse estado, sem que isso cause problemas com o encapsulamento.

Parece difícil, mas o memento é tranquilo. Ele salva um determinado estado do objeto, para você ter a possibilidade de voltar depois. Hummm, será que isso lembra alguma coisa?

Pense naquele resumo de TI que você está fazendo no Microsoft Word. Você se distrai por alguns minutos e percebe que anotou errado. Para corrigir, você precisa desfazer a escrita. Essa é uma boa aplicação do memento.

Padrões de Projeto Observer, State e Strategy

Observer: define uma relação de dependência, de forma que, quando um objeto tem seu estado modificado, os demais são notificados.

No observer, se um objeto mudar de estado, os outros ficam sabendo. Um bom exemplo disso para facilitar o seu entendimento é o Youtube. Se o canal do Estratégia postar um novo vídeo, os usuários com a notificação habilitada receberão um aviso.

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

Veja que o state é diferente do observer. Se o estado do objeto for alterado, haverá uma mudança de comportamento (e não uma simples notificação aos demais). Este padrão é muito utilizado na implementação de máquina de estados, fluxogramas em geral etc.  

Um bom exemplo deste padrão é a trilha estratégica. Dependendo do conhecimento que você tenha sobre determinado tópico da matéria, você vai direcionar o seu estudo para um ponto ou outro.

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

Como a própria definição diz, o strategy é aplicado em caso de família de algoritmos. Na computação, nós temos várias formas diferentes de fazer a mesma coisa. Cada forma seria um algoritmo diferente.

Um exemplo simples é a ordenação: podemos aplicar o quick sort, o merge sort etc. O seu estudo também pode ser feito de várias formas: alguns alunos preferem estudar por pdf, outros por videoaulas etc. São várias maneiras de adquirir conhecimento e chegar à aprovação.

Padrões de Projeto Template Method e Visitor

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

O template method cria uma classe abstrata, que seria o esqueleto de um determinado conceito do mundo real. Posteriormente, as subclasses concretas irão preencher esse esqueleto.

Veja que este padrão está intimamente ligado ao conceito de abstração. Suponha que o resumo do conteúdo seja a sua abstração. O resumo pode ser concretizado em vários formatos (pdf, docx, etc.).

Veja que o strategy e o template method são bem parecidos. A diferença é que o strategy trabalha com conceitos de herança, enquanto o template method trabalha com conceitos de delegação e composição. Mas não se preocupe porque as bancas não devem se aprofundar tanto assim.  

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

Embora seja o último, este padrão é o mais difícil de todos (brincadeira, rs). O visitor é utilizado quando você precisa definir novas operações e não quer mexer nas classes que já criou (evitar a famosa “poluição”). As novas operações seriam então definidas em uma classe separada.

Como o artigo já está acabando, você deve estar ansioso pelo mapa mental. Vamos utilizá-lo então como exemplo. Suponha que você já tenha alguns mapas prontos, mas aprendeu um novo conceito. A fim de não misturar com os mapas que já possui, você decide criar mais um. 

Mapa Mental

Agora sim, chegamos ao momento que você queria. Temos a certeza de que alguns alunos pularam todo o restante do artigo e vieram direto para este mapa mental de padrões de projeto. Estamos de olho.

O mapa de hoje é mágico, muito especial. Sabe por quê? Porque este é o mapa original dos nossos estudos, que nos ajudou com a nossa aprovação. Assim como ele trouxe sorte para nós, está decretado que ele também trará sorte para você. Aproveite então e revise-o periodicamente:

Figura 1 - Mapa Mental de Padrões de Projeto.
Figura 1 – Mapa Mental de Padrões de Projeto.

Conclusão

Em suma, apresentamos hoje um resumo de padrões de projeto, um dos principais assuntos abordados na disciplina de Engenharia de Software. Assim, se você leu o artigo na íntegra e entendeu bem os conceitos, o próximo passo agora será realizar muitas questões para treinar.

Alunos aprovados realizam centenas ou até milhares de questões para atingir seu objetivo. O acesso ao Sistema de Questões do Estratégia é feito pelo link: https://concursos.estrategia.com/.

Não esqueça também de retornar ao tópico periodicamente para fazer revisões. Elas são fundamentais para promover a fixação do conteúdo aprendido. Para agilizar o processo, utilize também o mapa mental disponibilizado como seu aliado. 

Por fim, se você quiser aprofundar o conteúdo ou tirar dúvidas específicas da linguagem, busque o material do Estratégia Concursos. Nós oferecemos diversos cursos em pdf, videoaulas e áudios para você ouvir onde quiser. Saiba mais por meio do link https://www.estrategiaconcursos.com.br/cursos/.

Bons estudos e até a próxima!

Cristiane Selem Ferreira Neves é Bacharel em Ciência da Computação e Mestre em Sistemas de Informação pela Universidade Federal do Rio de Janeiro (UFRJ), além de possuir a certificação Project Management Professional pelo Project Management Institute (PMI). Já foi aprovada nos seguintes concursos: ITERJ (2012), DATAPREV (2012), VALEC (2012), Rioprevidência (2012/2013), TJ-RJ (2022) e TCE-RJ (2022). Atualmente exerce o cargo efetivo de Especialista em Previdência Social – Ciência da Computação no Rioprevidência, além de ser colaboradora do Blog do Estratégia Concursos.

Concursos Abertos

Quer Saber Tudo de Concursos Previstos?

Confira Nossos Artigos

Concursos 2023

Deixe seu comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Veja os comentários
  • Nenhum comentário enviado.