using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models.Materials; using StructureHelperCommon.Services; using StructureHelperLogics.Models.Materials.Logics; namespace StructureHelperLogics.Models.Materials { public class HelperMaterialUpdateStrategy : IUpdateStrategy { private IUpdateStrategy elasticUpdateStrategy; private IUpdateStrategy frUpdateStrategy; private IUpdateStrategy concreteUpdateStrategy; private IUpdateStrategy reinforcementUpdateStrategy; private IUpdateStrategy steelUpdateStrategy; private IUpdateStrategy ElasticUpdateStrategy => elasticUpdateStrategy ??= new ElasticUpdateStrategy(); private IUpdateStrategy FrUpdateStrategy => frUpdateStrategy ??= new FRUpdateStrategy(); private IUpdateStrategy ConcreteUpdateStrategy => concreteUpdateStrategy ??= new ConcreteLibUpdateStrategy(); private IUpdateStrategy ReinforcementUpdateStrategy => reinforcementUpdateStrategy ??= new ReinforcementLibUpdateStrategy(); private IUpdateStrategy SteelUpdateStrategy => steelUpdateStrategy ??= new SteelLibMaterialUpdateStrategy(); private IUpdateStrategy safetyFactorUpdateStrategy = new HelpermaterialSafetyFactorsUpdateStrategy(); public HelperMaterialUpdateStrategy(IUpdateStrategy elasticStrategy, IUpdateStrategy frStrategy, IUpdateStrategy concreteStrategy, IUpdateStrategy reinforcementStrategy ) { this.elasticUpdateStrategy = elasticStrategy; this.frUpdateStrategy = frStrategy; this.concreteUpdateStrategy = concreteStrategy; this.reinforcementUpdateStrategy = reinforcementStrategy; } public HelperMaterialUpdateStrategy() { } public void Update(IHelperMaterial targetObject, IHelperMaterial sourceObject) { CheckObject.ThrowIfNull(sourceObject); CheckObject.ThrowIfNull(targetObject); if (ReferenceEquals(targetObject, sourceObject)) { return; } safetyFactorUpdateStrategy.Update(targetObject, sourceObject); if (sourceObject is ILibMaterial) { UpdateLibMaterial(targetObject, sourceObject); } else if (sourceObject is IElasticMaterial) { ElasticUpdateStrategy.Update(targetObject as IElasticMaterial, sourceObject as IElasticMaterial); } else if (sourceObject is IFRMaterial) { FrUpdateStrategy.Update(targetObject as IFRMaterial, sourceObject as IFRMaterial); } else { ErrorCommonProcessor.ObjectTypeIsUnknown(typeof(IHelperMaterial), sourceObject.GetType()); } } private void UpdateLibMaterial(IHelperMaterial targetObject, IHelperMaterial sourceObject) { if (sourceObject is IConcreteLibMaterial concreteLibMaterial) { ConcreteUpdateStrategy.Update(targetObject as IConcreteLibMaterial, concreteLibMaterial); } else if (sourceObject is IReinforcementLibMaterial reinforcementLibMaterial) { ReinforcementUpdateStrategy.Update(targetObject as IReinforcementLibMaterial, reinforcementLibMaterial); } else if (sourceObject is ISteelLibMaterial steelLibMaterial) { SteelUpdateStrategy.Update(targetObject as ISteelLibMaterial, steelLibMaterial); } else { ErrorCommonProcessor.ObjectTypeIsUnknown(typeof(ILibMaterial), sourceObject.GetType()); } } } }