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.