O Padrão de Projeto Adapter tem a finalidade de criar literalmente um adaptador entre objetos. Ele converte a interface de um objeto para a interface esperada por um cliente. Ou seja, ele consegue fazer com que objetos incompatíveis consigam ficar intercambiáveis e possam se comunicar efetivamente. Você vai encontrar o termo Wrapper para se referir ao padrão Adapter.
Existem diversas situações em que você precisará criar um adaptador. Sobretudo quando você estiver lidando com sistemas legados, por exemplo, utilizando classes que trabalharão na camada intermediária entre a aplicação cliente e a biblioteca em si.
Tem um exemplo muito simples porém muito eficiente para explicar o Padrão de Projeto Adapter. Todos temos tomadas em casa, e com essa questão do padrão de 3 pinos, temos alguns problemas com os padrões antigos, que utilizam apenas 2 pinos. A solução seria criar um Adapter(adaptador) para resolver esse problema.
Exemplo de uso do Padrão de Projeto Adapter
Existem muitos exemplos que podemos aplicar o padrão Adapter. Para ficar bem didático e simples, vamos criar um adaptador de moedas. A ideia é que não importa o input se for dólar ou euro (adaptee), sempre vai gerar o valor em real. Com isso, nosso alvo (target) será a conversão dos valores para real.
<?php declare(strict_types=1); namespace Growthdev\DesignPatterns\Structural\Adapter; interface CurrencyConverter { public function convert(float $amount): float; }
<?php declare(strict_types=1); namespace Growthdev\DesignPatterns\Structural\Adapter; final class CurrencyConverterAdapter { private CurrencyConverter $currencyConverter; public function __construct(CurrencyConverter $currencyConverter) { $this->currencyConverter = $currencyConverter; } public function convert(float $amount): float { return $this->currencyConverter->convert($amount); } }
<?php declare(strict_types=1); namespace Growthdev\DesignPatterns\Structural\Adapter; final class CurrencyToDollarConverter implements CurrencyConverter { public function convert(float $amount): float { return $amount * 5.61; // 1$ = R$ 5.61 } }
<?php declare(strict_types=1); namespace Growthdev\DesignPatterns\Structural\Adapter; final class CurrencyToEuroConverter implements CurrencyConverter { public function convert(float $amount): float { return $amount * 6.35; // 1 EUR = R$ 6.35 } }
Observe que o uso deste padrão segue as boas práticas de programação, como exemplo o uso de interface e não de uma implementação com dependência forte como no caso do uso de herança. Isso nos dá flexibilidade para o uso de diversos adaptadores. Por exemplo, se você quiser criar novos adaptadores, estes precisam apenas assinar o contrato da interface target.
Você conseguirá notar bem os benefícios deste pattern observando-o em ação. Veja:
<?php declare(strict_types=1); namespace Growthdev\DesignPatterns\Tests\Structural\Adapter; use Growthdev\DesignPatterns\Structural\Adapter\CurrencyConverterAdapter; use Growthdev\DesignPatterns\Structural\Adapter\CurrencyToDollarConverter; use Growthdev\DesignPatterns\Structural\Adapter\CurrencyToEuroConverter; use PHPUnit\Framework\TestCase; final class CurrencyAdapterTest extends TestCase { public function testCurrencyConverterToEuro(): void { $currencyConverter = new CurrencyConverterAdapter(new CurrencyToEuroConverter); $this->assertEquals(6.35, $currencyConverter->convert(1.0)); } public function testCurrencyConverterToDollar(): void { $currencyConverter = new CurrencyConverterAdapter(new CurrencyToDollarConverter); $this->assertEquals(5.61, $currencyConverter->convert(1.0)); } }
Todos os códigos dos exemplos da série de postagens, que está organizado no artigo Resumo dos Padrões de Projetos, você pode encontrar no meu Github:
https://github.com/growthdev-repo/design-patterns
Se você estiver gostando desta série de artigos, compartilhe e se tiver alguma dúvida, deixa aqui o seu comentário. Até o próximo artigo!
Confiança Sempre!!!
Fontes:
- [1] GAMMA, Erich et al. Padrões de Projeto: Soluções reutilizáveis de software orientado a objetos.
- https://www.devmedia.com.br/padrao-de-projeto-adapter-em-java/26467
- https://howtodoinjava.com/design-patterns/structural/adapter-design-pattern-in-java/
Espetáculo.
Estou usando muito seu site.
Parabéns e obrigado!
Fico feliz! Abraço!
A unica coisa que o adapter serve é para fazer essas adaptações “gambiada”?
Opa Railson, valeu pela visita!
Se me permite discordar da parte “gambiada”(“gambiarra”). Quando temos objetos incompatíveis e temos um pattern que consegue deixá-los intercambiáveis, isso está longe de ser uma “gambiarra”.
Será uma “gambiarra” se você utilizar esse Adapter para resolver problemas que não sejam relativos a problemas de incompatibilidade de interface.
Situações onde você normalmente utilizará Adapters:
Continuei acompanhando! Forte abraço!