Os padrões de projeto estruturais são utilizados para organizar objetos de maneira eficiente. Eles ajudam na criação de classes e objetos que sejam fáceis de entender e manter. Além disso, eles permitem que a funcionalidade seja adicionada aos objetos sem alterar sua estrutura básica. Os padrões mais comuns incluem o Adapter, Bridge, Decorator e Facade. Cada um desses padrões oferece uma maneira diferente de organizar objetos e adicionar funcionalidade.

Padrões estruturais explicam como montar objetos e classes em estruturas maiores, mantendo essas estruturas flexíveis e eficientes.

Padrões Estruturais

O Adapter é um padrão de projeto estrutural que converte chamadas entre pelo menos duas classes com interfaces incompatíveis. Isso resolve um problema de compatibilidade, permitindo que duas classes que, de outra forma, não poderiam trabalhar juntas, possam colaborar e fornecer a funcionalidade necessária. É como um tradutor que intermedeia dois lados que não se comunicam entre si, ou um adaptador de tomada que converte a tomada de três pinos em uma tomada de dois pinos, permitindo que você use o dispositivo.

Não é sempre possível (ou simplesmente é impossível) alterar o fornecedor, e também é indesejável alterar o cliente, já que há muitos clientes e seria necessário alterar todos eles.

adapter.png


O Bridge é um padrão de projeto estrutural que permite que uma abstração e sua implementação sejam desenvolvidas independentemente umas das outras, permitindo que ambas possam evoluir sem afetar a outra. Isso é útil quando se deseja mudar a implementação de uma classe sem afetar a interface que ela oferece. Utilizada quando se tem uma classe monolítica que possui diversas variações de uma funcionalidade e deseja-se dividi-la e organiza-la em várias hierarquias de classes.

O Bridge cria duas hierarquias, uma para a implementação e outra para a abstração. A hierarquia de implementação define a funcionalidade real enquanto que a hierarquia de abstração fornece uma interface para o cliente interagir com a implementação. O Bridge é usado para separar a interface do usuário da implementação real, permitindo que o usuário interaja com a interface sem saber como a implementação funciona nos bastidores.

Untitled


O Decorator é um padrão de projeto estrutural usado para adicionar comportamento ou funcionalidade a um objeto existente sem alterar sua estrutura básica (sua interface). Isso é útil quando você precisa adicionar funcionalidade a um objeto em tempo de execução, em vez de fazê-lo durante o tempo de compilação. Isso ocorre por meio da composição recursiva.

Um exemplo de uso do padrão Decorator seria na criação de uma bebida, como um café. Suponha que temos uma classe base Bebida que contém as informações básicas de uma bebida, como o nome e o preço. Em seguida, podemos criar uma classe Cafe que herda da classe Bebida, e que define um café simples, sem adições.

A partir daí, podemos criar classes decoradoras, como CanelaDecorator e CremeDecorator, que herdam de Bebida e que adicionam novas funcionalidades à bebida base. Por exemplo, CanelaDecorator pode adicionar uma quantidade de canela à bebida, enquanto CremeDecorator pode adicionar creme.

Podemos então criar uma instância de Cafe, e decorá-la com os decoradores de nossa escolha. Por exemplo, podemos criar um CafeComCanela decorando um Cafe com CanelaDecorator, ou um CafeComCremeECanela decorando um Cafe com CremeDecorator e depois com CanelaDecorator.

Dessa forma, podemos adicionar funcionalidades a uma bebida de forma dinâmica, sem que seja necessário criar uma nova classe para cada combinação de adições.

Untitled


O Facade é um padrão de projeto estrutural utilizado para simplificar a interface de um sistema complexo (biblioteca, framework), fornecendo uma nova interface única para objetos existentes e mais fácil de usar para o cliente, sendo que este, enxerga apenas o Facade, não conhecendo os outros objetos, por uma questão de complexidade e segurança.

facade.png