1
// 1. Proveedor A: Clase Estructurada con ES6
class StripeGateway {
nombre = "Stripe Credit Card";
procesarPago(monto) {
console.log(`💳 [Stripe API] Tokenizando tarjeta y debitando $${monto.toFixed(2)}.`);
return { exito: true, transaccionId: "ch_" + Math.random().toString(36).substring(2, 9) };
}
}
// 2. Proveedor B: Clase con lógica distinta
class PayPalGateway {
nombre = "PayPal Wallet";
procesarPago(monto) {
console.log(`🅿️ [PayPal Orders] Redirigiendo a aprobación y cobrando $${monto.toFixed(2)}.`);
return { exito: true, transaccionId: "PAYID-" + Math.floor(10000 + Math.random() * 90000) };
}
}
// 3. Proveedor C: Objeto Literal Puro (Duck Typing en su máxima expresión)
// ¡Ni siquiera es una clase, pero cumple el contrato porque "grazna como pato"!
const fakeMockTestingGateway = {
nombre: "Mock Fake (Ambiente de Pruebas Unitarias)",
procesarPago(monto) {
console.log(`🧪 [Mock Testing] Simulando aprobación instantánea de $${monto.toFixed(2)} sin dinero real.`);
return { exito: true, transaccionId: "TEST-MOCK-999" };
}
};
// 4. Servicio de Checkout Desacoplado
class CheckoutService {
cobrarPedido(pasarela, cliente, total) {
// Validación defensiva opcional (comprobar que grazne como pato)
if (typeof pasarela.procesarPago !== 'function') {
throw new TypeError(`El proveedor recibido no implementa el método procesarPago()`);
}
console.log(`\n🛒 Iniciando compra de [${cliente}] por $${total.toFixed(2)} con: ${pasarela.nombre}`);
const resultado = pasarela.procesarPago(total);
if (resultado.exito) {
console.log(` Factura emitida con ID de Transacción: ${resultado.transaccionId}`);
}
}
}
// ==========================================
// PRUEBA POLIMÓRFICA EN EL SANDBOX
// ==========================================
const checkout = new CheckoutService();
// Caso 1: Pagando con Stripe
checkout.cobrarPedido(new StripeGateway(), "Carlos Mendoza", 149.99);
// Caso 2: Pagando con PayPal
checkout.cobrarPedido(new PayPalGateway(), "Valeria Torres", 89.00);
// Caso 3: Pruebas automatizadas con el objeto literal
checkout.cobrarPedido(fakeMockTestingGateway, "Usuario Pruebas", 10.00);
Haz clic para editar este código