🔌 Adapter - EmilioCrespoPeran/pattern-designs GitHub Wiki
📚 Descripción del patrón
El patrón Adapter permite adaptar la interfaz de una clase existente a otra esperada por el cliente. Útil cuando necesitas integrar servicios o librerías con interfaces incompatibles.
🧩 Enunciado del ejercicio
Supón que tienes dos servicios de pago externos: StripeService
y PayUService
, cada uno con métodos distintos para procesar pagos.
Tareas:
-
Crea una interfaz común
ProcesadorPago
con métodoString procesarPago(double monto)
. -
Implementa dos adaptadores:
StripeAdapter
adaptaStripeService.charge()
.PayUAdapter
adaptaPayUService.realizarPago()
.
Objetivo: Usar ambas pasarelas de pago sin que el cliente sepa cómo están implementadas.
public class PayUService {
public String realizarPago(double cantidadEnPesos) {
return "Pago realizado en PayU por $" + cantidadEnPesos;
}
}
public class StripeService {
public boolean charge(double amountUSD) {
System.out.println("Stripe procesó el pago de $" + amountUSD);
return true;
}
}
🧪 Test
@SpringBootTest
public class PayUAdapterTests {
@Test
void debeProcesarPagoUsandoPayU() {
ProcesadorPago procesador = new PayUAdapter(new PayUService());
String resultado = procesador.procesarPago(250.00);
assertNotNull(resultado);
assertTrue(resultado.contains("PayU"));
assertEquals("Pago realizado en PayU por $250.0", resultado);
}
@Test
void debeProcesarPagoUsandoStripe() {
ProcesadorPago procesador = new StripeAdapter(new StripeService());
String resultado = procesador.procesarPago(150.00);
assertNotNull(resultado);
assertEquals("Pago procesado exitosamente en Stripe: $150.0", resultado);
}
@Test
void debePermitirUsoPolimorficoDelAdapter() {
ProcesadorPago payU = new PayUAdapter(new PayUService());
ProcesadorPago stripe = new StripeAdapter(new StripeService());
assertEquals("Pago realizado en PayU por $100.0", payU.procesarPago(100.00));
assertEquals("Pago procesado exitosamente en Stripe: $100.0", stripe.procesarPago(100.00));
}
@Test
void debeRetornarMensajeErrorSiStripeFalla() {
ProcesadorPago procesador = new StripeAdapter(new StripeService() {
@Override
public boolean charge(double amountUSD) {
return false; // simula fallo
}
});
String resultado = procesador.procesarPago(75.00);
assertEquals("Error al procesar pago con Stripe", resultado);
}
}