.NET
  Design Pattern  
▌背景
| 
專案中需要判斷三次邏輯後,決定程式要執行的邏輯。 
因此採用Design Pattern :
  State 來取代這些槽狀迴圈。 | 
▌環境
| 
l   Windows 7 pro 
l   Visual Studio 2012
  (C#) | 
▌實作
▋State : Initiate
l   所有狀態的列舉型別
| 
public enum TriggerActValStateEnum 
    { 
        Null = 1, 
        IamProfitAivCashIncludingLoss, 
        IamProfitAivCashPure, 
        IamProfitAivCntIncludingLoss, 
        IamProfitAivCntPure, 
        IamProfitAivRateIncludingLoss, 
        IamProfitAivRatePure 
    } | 
l   State interface
| 
/// <summary> 
///狀態interface 
/// </summary> 
public interface ITriggerActValState 
    { 
        /// <summary> 
        /// Trigger統計的方式 
        /// </summary> 
        TriggerActValStateEnum
  TriggerActValStateEnum { get; set; } 
        /// <summary> 
        /// 
  執行目前的狀態要做的事情,並設定下一個狀態 
        /// </summary> 
        void SetNewState(TriggerActValContext _context); 
    } | 
l   Create update codes
for the Model
| 
/// <summary> 
/// abstract class
  for 狀態 
/// </summary> 
public abstract class TriggerActValState : ITriggerActValState 
    { 
        public TriggerActValStateEnum
  TriggerActValStateEnum { get; set; } 
        public abstract void SetNewState(TriggerActValContext context); 
    } | 
l   Context for state
pattern
| 
/// <summary> 
/// Context for state
  pattern 
/// </summary> 
    public class TriggerActValContext:IDisposable 
    { 
        /// <summary> 
        /// 目前的狀態類別 
        /// </summary> 
        public ITriggerActValState State {get;set;} 
        /// <summary> 
        /// 條件一  
        /// </summary> 
        public TriggerTypeEnum TriggerType { get; set; } 
        /// <summary> 
        /// 條件二 
        /// </summary> 
        public AIVTypeEnum AivType { get; set; } 
        /// <summary> 
        /// 條件三 
        /// </summary> 
        public bool IsIncludingOpposite { get; set; } 
        /// <summary> 
        /// Constructor 
        /// </summary> 
        /// <param
  name="triggerType">條件一</param> 
        /// <param
  name="aivType">條件二</param> 
        /// <param name="isIncludingOpposite">條件三</param> 
        public TriggerActValContext( 
            TriggerTypeEnum triggerType, 
            AIVTypeEnum aivType, 
            bool isIncludingOpposite) 
        { 
            this.TriggerType = triggerType; 
            this.AivType = aivType; 
            this.IsIncludingOpposite =
  isIncludingOpposite; 
            switch(triggerType) //由判斷條件一決定下一個狀態 
            { 
                case TriggerTypeEnum.Profit: 
                    this.State = new IamProfitTrigger(); 
                    break; 
                case TriggerTypeEnum.Loss: 
                    this.State = new IamLossTrigger(); 
                    break; 
                default: 
                    break; 
            } 
        } 
        /// <summary> 
        /// 執行State裡面的動作 
        /// </summary> 
        public void EnableState() 
        { 
            this.State.SetNewState(this); 
        } 
    } | 
▋State : Implement
Every State
l   判斷條件二決定下一個狀態
| 
public class IamProfitTrigger : TriggerActValState 
    { 
        public override void SetNewState(TriggerActValContext context) 
        { 
//設定目前狀態 
            base.TriggerActValStateEnum = TriggerActValStateEnum.Null; 
            //設定下一個工作 
            switch(context.AivType) 
            { 
                case AIVTypeEnum.Cash: 
                    context.State = new IamProfitAivCash(); 
                    break; 
                case AIVTypeEnum.Counter: 
                    context.State = new IamProfitAivCnt(); 
                    break; 
                case AIVTypeEnum.Rate: 
                    context.State = new IamProfitAivRate(); 
                    break; 
                default: 
                    break; 
            } 
            context.EnableState(); 
        } 
    } | 
l   判斷條件三決定下一個狀態
| 
public class IamProfitAivCnt : TriggerActValState 
    { 
        public override void SetNewState(TriggerActValContext context) 
        { 
            //設定目前狀態 
            base.TriggerActValStateEnum = TriggerActValStateEnum.Null; 
            //設定下一個工作 
            if (context.IsIncludingOpposite) 
            { 
                context.State = new IamProfitAivCntIncludingLoss(); 
            } 
            else 
            { 
                context.State = new IamProfitAivCntPure(); 
            } 
           
  context.EnableState(); 
        } 
    } | 
l   決定最後的狀態
| 
public class IamProfitAivCashIncludingLoss : TriggerActValState 
    { 
        public override void SetNewState(TriggerActValContext context) 
        { 
            //設定目前狀態 
            base.TriggerActValStateEnum = TriggerActValStateEnum.IamProfitAivCashIncludingLoss; 
        } 
    } | 
▋主程式
| 
using (var context = new TriggerActValContext(triggerType,
  aivType, isIncludingLoss)) 
{ 
context.EnableState(); 
//依據最後的狀態,決定要執行的邏輯 
    switch (context.State.TriggerActValStateEnum) 
    { 
case TriggerActValStateEnum.IamProfitAivCntPure: 
         //執行邏輯 
             break; 
         case TriggerActValStateEnum.IamProfitAivCashPure: 
         //執行邏輯 
             break; 
         //… 
         default: 
             break; 
     } 
} | 
▋Reference 
 
沒有留言:
張貼留言