狀態模式重構條件語句
直接上代碼:code
/// <summary> /// 狀態模式的環境類 /// </summary> public class CalculateContext { private IShippingAmount _Calculate; public CalculateContext() => _Calculate = new GetAlaskaShippingAmount(); public void SetAddress(IShippingAmount calculate) => _Calculate = calculate; public decimal CalculateAmount() => _Calculate.GetAmount(); } // 抽象 public interface IShippingAmount { AddressState State { get; } decimal GetAmount(); } #region 具體地址的實現 // 具體 public class GetAlaskaShippingAmount : IShippingAmount { public AddressState State { get => AddressState.Alaska; } public decimal GetAmount() => 15; } public class GetNewYorkShippingAmount : IShippingAmount { public AddressState State { get => AddressState.NewYork; } public decimal GetAmount() => 10; } public class GetFloridaShippingAmount : IShippingAmount { public AddressState State { get => AddressState.Florida; } public decimal GetAmount() => 3; } #endregion
客戶端調用:對象
#region 狀態模式重構switch...case... static void SwitchToStateDP() { var ctx = new CalculateContext(); ctx.CalculateAmount(); ctx.SetAddress(new GetFloridaShippingAmount()); ctx.CalculateAmount(); } #endregion
狀態模式:當一個對象的內部狀態改變時容許改變它的行爲。狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時的狀況。把狀態的判斷邏輯轉移到表示不一樣狀態的一系列類當中,能夠把複雜的判斷邏輯簡化。
客戶端經過SetAddress(對應狀態模式中的內部狀態改變)來調整客戶的選擇(也就是條件)。ip