Adapter
O Adapter é um padrão estrutural utilizado quando precisamos fazer duas interfaces incompatíveis trabalharem juntas.
A ideia é criar uma camada intermediária que adapta uma interface para outra.
Imagine que nosso sistema espera:
interface Payment {
pay(amount: number): void;
}
Mas uma biblioteca externa possui:
class StripeSDK {
makePayment(value: number) {
console.log(
`Pagamento de R$ ${value}`
);
}
}
O problema é que nosso sistema espera:
pay()
Mas a biblioteca oferece:
makePayment()
Podemos criar um Adapter:
class StripeAdapter
implements Payment {
constructor(
private stripe: StripeSDK
) {}
pay(amount: number) {
this.stripe.makePayment(amount);
}
}
Agora podemos usar:
const stripe =
new StripeSDK();
const payment =
new StripeAdapter(stripe);
payment.pay(100);
O sistema conhece apenas:
Payment
Enquanto o Adapter conhece os detalhes do:
StripeSDK
Exemplo prático
Imagine que seu sistema utiliza:
interface Logger {
log(message: string): void;
}
Você deseja utilizar uma biblioteca externa:
class ExternalLogger {
writeLog(message: string) {
console.log(
`[LOG] ${message}`
);
}
}
Criamos:
class LoggerAdapter
implements Logger {
constructor(
private logger: ExternalLogger
) {}
log(message: string) {
this.logger.writeLog(message);
}
}
Agora:
const logger =
new LoggerAdapter(
new ExternalLogger()
);
logger.log(
"Usuário criado"
);
Quando usar?
O Adapter é útil quando:
- Uma biblioteca externa possui uma API incompatível.
- Você está integrando sistemas legados.
- Quer trocar uma implementação sem alterar o código cliente.
- Precisa adaptar APIs diferentes para uma interface comum.
A ideia principal é:
Fazer interfaces incompatíveis trabalharem juntas sem modificar suas implementações originais.