Ir ao conteúdo

Padrão de Projeto Adapter em PHP com exemplo

Atualizado pela última vez em 13 de dezembro de 2021

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:

Publicado emDesign PatternPadrões de ProjetosPHP

Seja o primeiro a comentar

Deixe um comentário

O seu endereço de e-mail não será publicado.