狀態模式重構條件語句 直接上代碼: 客戶端調用: 狀態模式:當一個對象的內部狀態改變時允許改變它的行為。狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。 客戶端通過SetAddress(對應狀態模式中 ...
狀態模式重構條件語句
直接上代碼:
/// <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(對應狀態模式中的內部狀態改變)來調整客戶的選擇(也就是條件)。