public ShippingDetailInfo Execute(ShippingDetailInfo input) { IZoneDifferenceStrategy zoneDiffDecor = ZoneDifferenceStrategyFactory.GetInstance().GetZoneDifferenceDecoratorInstance(input.DeliveryMethod); int zoneDifference = zoneDiffDecor.Difference(input.OriginAddress.PostalCode, input.DestinationAddress.PostalCode); switch (input.DeliveryMethod) { case DeliveryMethodEnum.Air: input.Cost = zoneDifference * OunceToPound(Convert.ToDouble(input.PackageInfo.Weight)) * GetPackageVolume(input.PackageInfo); break; case DeliveryMethodEnum.Rail: case DeliveryMethodEnum.Ground: input.Cost = zoneDifference * OunceToPound(Convert.ToDouble(input.PackageInfo.Weight)); break; default: throw new InvalidOperationException(); } // Insurance Calculation if (input.IsInsured) { input.Cost *= 1.02; } return(input); }
public IZoneDifferenceStrategy GetZoneDifferenceDecoratorInstance(DeliveryMethodEnum input) { IZoneDifferenceStrategy result = null; switch (input) { case DeliveryMethodEnum.Air: case DeliveryMethodEnum.Ground: if (timeZoneDifferenceDecorator == null) { timeZoneDifferenceDecorator = new TimeZoneDifferenceStrategy(); } result = timeZoneDifferenceDecorator; break; case DeliveryMethodEnum.Rail: if (orientationZoneDifferenceDecorator == null) { orientationZoneDifferenceDecorator = new OrientationZoneDifferenceStrategy(); } result = orientationZoneDifferenceDecorator; break; default: break; } return(result); }
public void GetZoneDifferenceDecoratorInstanceTest() { ZoneDifferenceStrategyFactory target = ZoneDifferenceStrategyFactory.GetInstance(); DeliveryMethodEnum input = DeliveryMethodEnum.Rail; IZoneDifferenceStrategy expected = ZoneDifferenceStrategyFactory.GetInstance().GetZoneDifferenceDecoratorInstance(DeliveryMethodEnum.Rail); IZoneDifferenceStrategy actual; actual = target.GetZoneDifferenceDecoratorInstance(input); Assert.AreEqual(expected, actual); }