Fala, meus consagrados! Beleza?
Já iniciamos os estudos sobre o grupo de padrões de projetos mais citado em concursos são os Padrões GoF (Gang of Four). Esses padrões são categorizados em três grupos principais: Padrões de Criação, Padrões Estruturais e Padrões Comportamentais. No artigo anterior, estudamos os Padrões Criacionais. Nesta agora, o foco serão os Padrões Estruturais.
Os Padrões Estruturais preocupam-se com a forma como classes e objetos são compostos para formar estruturas maiores e mais complexas. Esses padrões explicam como montar objetos e classes em estruturas maiores, mantendo as estruturas flexíveis e eficientes. Eles ajudam a garantir que as relações entre os objetos sejam flexíveis, extensíveis e eficientes.
Os Padrões Estruturais são compostos pelos seguintes padrões:
- Padrão Bridge;
- Padrão Adapter;
- Padrão Composite;
- Padrão Decorator;
- Padrão Façade;
- Padrão Flyweight; e
- Padrão Proxy.
Figura 1: Padrões Estruturais.
A dica de memorização é:A ponte (Bridge) adaptada (Adapter) é composta (Composite) de decorações (Decorator) na fachada (Façade) para o peso mosca (Flyweight) se “aproxymar” (Proxy).
Figura 2: Dica de memorização dos Padrões Estruturais.
Peço perdão pela palavra “aproxymar”, mas tive que fazer uma adaptação (Adapter) a fim de trazer uma frase com sentido. =)
Agora vamos destrinchar cada um dos sete padrões acima.
O padrão Bridge separa uma abstração de sua implementação, permitindo que ambas evoluam independentemente. Esse padrão permite que se divida uma classe grande ou um conjunto de classes intimamente ligadas em duas hierarquias separadas (abstração e implementação) que podem ser desenvolvidas independentemente umas das outras. Isso é útil quando se deseja evitar uma explosão de subclasses, permitindo que diferentes abstrações se conectem com diferentes implementações de forma flexível.
O padrão Adapter permite que objetos com interfaces incompatíveis trabalhem juntos. Faz a correspondência de interfaces de classes diferentes e permite que objetos com interfaces incompatíveis colaborarem entre si. Esse padrão traz a ideia de um intermediário entre dois objetos, convertendo a interface de um deles para que se ajuste ao outro. Isso facilita a reutilização de classes existentes sem a necessidade de modificar seu código-fonte.
O padrão Composite representa uma estrutura de árvore de objetos simples ou compostos. O Composite permite que se componha objetos em estruturas de árvores e essas estruturas então são trabalhadas como se elas fossem objetos individuais. Esse padrão permite que se construa objetos em uma estrutura de árvore para representar partes e hierarquias de partes. Isso é útil quando você deseja tratar objetos individuais e composições de objetos da mesma maneira, facilitando a criação de estruturas complexas.
O padrão Decorator, embora não seja um padrão estrutural puro, é frequentemente agrupado com os padrões estruturais. Esse padrão adiciona responsabilidades a objetos dinamicamente e permite que se acople novos comportamentos para objetos ao colocá-los dentro de invólucros de objetos que contém os comportamentos. O Decorator permite que se adicione responsabilidades a objetos de forma dinâmica, encapsulando-os em uma série de decoradores. Isso evita a necessidade de criar subclasses para cada combinação de funcionalidade.
Os padrões Composite e Decorator são usados em conjunto para criar estruturas complexas de objetos que também podem ter responsabilidades adicionais.
O padrão Façade representa uma única classe que representa um subsistema inteiro e fornece uma interface simplificada para uma biblioteca, um framework, ou qualquer conjunto complexo de classes. Esse padrão fornece uma interface simplificada e unificada para um conjunto complexo de classes ou subsistemas, tornando mais fácil para os clientes interagirem com o sistema. Ele atua como uma camada intermediária que oculta a complexidade subjacente e oferece um ponto de entrada único para realizar operações comuns. Isso promove a modularidade, a manutenção e a redução da dependência entre o cliente e os componentes internos, melhorando a flexibilidade e a legibilidade do código. O Façade é especialmente útil quando se lida com sistemas grandes e complexos, onde é desejável encapsular a lógica de inicialização e interação com o sistema em uma única classe ou objeto Façade.
O padrão Flyweight representa uma instância refinada que é usada para compartilhamento eficiente. Esse padrão permite colocar mais objetos na quantidade de RAM disponível ao compartilhar partes comuns de estado entre os múltiplos objetos, ao invés de manter todos os dados em cada objeto. O Flyweight visa minimizar o uso de memória ou recursos compartilhando partes comuns entre objetos. Isso é especialmente útil quando se precisa criar muitas instâncias semelhantes de um objeto e deseja economizar recursos.
Por último, o padrão Proxy cria um objeto que representa outro objeto e permite que se forneça um substituto ou um espaço reservado para outro objeto. O Proxy atua como um substituto para outro objeto para controlar o acesso a ele. Isso pode ser útil para adicionar funcionalidades como controle de acesso, registro de chamadas, lazy loading e muito mais.
Os Padrões Estruturais dos GoF são ferramentas poderosas para projetar sistemas de software flexíveis e eficientes. Eles fornecem abordagens sólidas para resolver problemas de composição, adaptabilidade e organização de objetos em hierarquias complexas. Ao entender e aplicar esses padrões, os desenvolvedores podem melhorar a modularidade, a reutilização de código e a manutenção do software, resultando em sistemas mais robustos e de fácil evolução.
Espero que tenham gostado!
Forte abraço e até a próxima jornada!
_________________________
Professor Rogerão Araújo
Clique nos links abaixo:
Receba gratuitamente no seu celular as principais notícias do mundo dos concursos!
Clique no link abaixo e inscreva-se gratuitamente:
Participe da conversa