Padrões de Projeto - Bridge

Bridge é um padrão de projeto estrutural que visa desacoplar uma abstração de sua implementação, de forma que permita que ambos evoluam de forma independente.

O uso desse padrão é recomendado ao lidar com classes que possuem muitas implementações diferentes e usam herança para implementar a abstração. Nesses casos, a herança conecta uma implementação à abstração permanentemente, de forma que é difícil modificar, aumentar e reutilizar as abstrações de forma independente.

Para dar um exemplo ilustrado, vamos fingir que temos um cenário onde queremos criar diferentes tipos de contas bancárias: CheckingAccount e SavingsAccount. Queremos que nosso sistema seja flexível para a criação de novos tipos de contas, então criamos uma classe abstrata chamada BankAccount e estendemos esta classe com as classes CheckingAccount e SavingsAccount.

Ótimo! Mais tarde, queremos dar aos nossos tipos de conta seu próprio tipo de cartão de crédito personalizado. Criamos as classes BasicCreditCard, SilverCreditCard e GoldCreditCard. Ao vincular esses cartões de crédito a cada tipo de conta bancária, o problema fica claro:

Implementation without bridge pattern

A abordagem ingênua seria criar uma combinação para cada tipo de conta, uma solução que é cara e cresce exponencialmente (imagine o tanto de trabalho se adicionarmos um novo tipo de conta!). O código também é altamente acoplado, pois estados e comportamentos diferentes estariam contidos em uma única classe.

O padrão Bridge resolve esse problema mudando de herança para composição e realocando todas as classes CreditCard para sua própria hierarquia. Ao fazer isso, permitimos que ambos os contextos evoluam e mudem independentemente.

Implementation with bridge pattern

Com esse design em mente, vamos então criar nossa interface CreditCard:

CreditCard.java class

Agora, vamos criar nossos tipos: Basic, Silver e Gold, todos implementando os métodos especificados pela interface CreditCard.

BasicCreditCard.java class

SilverCreditCard.java class

GoldCreditCard.java class

Vamos criar a abstração BankAccount, a classe base para nossos tipos de conta. Esta classe terá um objeto CreditCard, bem como um método para obter as informações do cartão.

BankAccount.java class

Com tudo criado, podemos escrever nossos tipos de conta CheckingAccount e SavingsAccount:

CheckingAccount.java class

SavingsAccount.java class

Para testar nosso projeto, criaremos uma classe principal inicializando cada conta com seus respectivos tipos de cartão de crédito.

BridgeApplication.java class

…que gera o seguinte conteúdo:

Output.java class

No fim das contas, o padrão Bridge é uma ótima ferramenta para ser utilizada quando queremos dividir e refatorar classes com muitas variantes, e também quando precisamos estender uma classe em dimensões independentes. Um grande benefício em usar esse padrão é que ele segue o princípio aberto/fechado (já que podemos adicionar abstrações e implementações sem afetar as existentes) e o princípio de responsabilidade única.

Você pode verificar a implementação completa deste exemplo aqui no meu Github: GracieleDamasceno/design-patterns!

Referências:

Bridge Pattern - Refactoring Guru

Design Patterns (2005), By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Craig Larman

Criado com Hugo
Tema Stack desenvolvido por Jimmy