namespace StrategyPatternExample
public interface IEstrategiaEnvio
decimal CalcularCostoEnvio(double peso, double distancia);
public class EnvioEstandar : IEstrategiaEnvio
public decimal CalcularCostoEnvio(double peso, double distancia)
return (decimal)(0.5 * distancia);
public class EnvioExpress : IEstrategiaEnvio
public decimal CalcularCostoEnvio(double peso, double distancia)
return (decimal)(1.0 * distancia + 2.0 * peso);
public IEstrategiaEnvio EstrategiaEnvio { get; set; }
public double Peso { get; private set; }
public double Distancia { get; private set; }
public Pedido(double peso, double distancia)
public decimal CalcularCostoEnvio()
return EstrategiaEnvio.CalcularCostoEnvio(Peso, Distancia);
Console.WriteLine("Ingrese el peso del paquete (kg):");
double peso = double.Parse(Console.ReadLine());
Console.WriteLine("Ingrese la distancia de envío (km):");
double distancia = double.Parse(Console.ReadLine());
Pedido pedido = new Pedido(peso, distancia);
Console.WriteLine("Seleccione el tipo de envío: 1 para Estándar, 2 para Express");
int tipoEnvio = int.Parse(Console.ReadLine());
pedido.EstrategiaEnvio = new EnvioEstandar();
pedido.EstrategiaEnvio = new EnvioExpress();
Console.WriteLine("Opción no válida, se asignará Envío Estándar por defecto.");
pedido.EstrategiaEnvio = new EnvioEstandar();
decimal costo = pedido.CalcularCostoEnvio();
Console.WriteLine($"El costo de envío es: ${costo}");