O problema
Imagine que o sistema espera um serviço de pagamento com IPagamento.Cobrar(decimal), mas o fornecedor legado oferece EnviarCobranca(int centavos). Alterar o fornecedor pode ser impossível ou arriscado. Adapter protege o cliente da diferença e converte valores e chamadas.
Exemplo em C#
public interface IPagamento { void Cobrar(decimal valor); }
public sealed class GatewayLegado
{
public void EnviarCobranca(int centavos) { /* API externa */ }
}
public sealed class PagamentoAdapter(GatewayLegado legado) : IPagamento
{
public void Cobrar(decimal valor) =>
legado.EnviarCobranca(decimal.ToInt32(valor * 100));
}A conversão de moeda e arredondamento precisa seguir uma regra explícita do domínio, não uma suposição escondida no adapter.
Quando usar e cuidados
Use ao integrar bibliotecas, APIs externas ou legado com contratos diferentes. Mantenha a tradução na fronteira e teste conversões, erros e unidades. Evite uma camada que apenas repassa chamadas sem resolver incompatibilidade real.
Facade simplifica um subsistema inteiro; Adapter compatibiliza uma interface. Veja também Decorator e o guia GoF.