Skip to content

Padrão de Projeto Adapter em PHP com exemplo

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.

Diagrama De Casse Adapter Pattern
Diagrama De Casse Adapter Pattern

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:

Olá! Sou Walmir, engenheiro de software com MBA em Engenharia de Software e o cérebro por trás do GrowthCode e autor do livro "Além do Código". Se você acha que programação é apenas sobre escrever código, prepare-se para expandir seus horizontes. Aqui, nós vamos além do código e exploramos as interseções fascinantes entre tecnologia, negócios, artes e filosofia. Você está em busca de crescimento na carreira? Quer se destacar em um mercado competitivo? Almeja uma vida mais rica em conhecimento e realização? Então você chegou ao lugar certo. No GrowthCode, oferecemos insights profundos, estratégias comprovadas e um toque de sabedoria filosófica para catalisar seu crescimento pessoal e profissional.

Published inDesign PatternPadrões de ProjetosPHP

4 Comments

    • 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:

      • Integração de APIs de Pagamento
      • Adaptação entre sistemas legados
      • Loggers
      • Middleware em Frameworks Web
      • Controles de Hardware
      • Etc…

      Continuei acompanhando! Forte abraço!

Deixe um comentário

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