Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
app.js
Tab = 4 espacios
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
Vista Previa
Consola Virtual JavaScript