2009-07-21 53 views
2

此處的對象是更新UI。我通常在客戶端執行此操作,但此應用程序使用後面的代碼。無論如何,我的問題是我試圖清理這些如果其他陳述,我認爲戰略模式可能是適當的。我不需要爲我完成所有的事情,但如果你可以給我一些指針來開始。我是否首先創建一個接口,然後每個策略實現接口?泛型在這裏有用嗎?界面中應該有哪些類型的方法?任何讓我走的東西將非常感激。重構幫助 - 策略模式

if (someObject.Status == 'A') { 
        btnRecordCall.Enabled = false; 
        btnAddMailOrStatusAction.Enabled = false; 
        btnPayments.Enabled = false; 
        btnAddressMaint.Enabled = false; 
        btnFilter.Enabled = false; 
        btnAddCoverage.Enabled = false; 
        btnPolicyForms.Enabled = false; 
        lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********"; 
       } else if (someObject.Status == 'D') { 
        btnRecordCall.Enabled = false; 
        btnAddMailOrStatusAction.Enabled = false; 
        btnPayments.Enabled = false; 
        btnAddressMaint.Enabled = false; 
        btnFilter.Enabled = false; 
        btnAddCoverage.Enabled = false; 
        btnPolicyForms.Enabled = false; 
        lblIsArchived.Text = "- De-archive Request Pending"; 
       } else { 
        btnRecordCall.Enabled = true; 
        btnAddMailOrStatusAction.Enabled = true; 
        btnPayments.Enabled = true; 
        btnAddressMaint.Enabled = true; 
        btnFilter.Enabled = true; 
        btnAddCoverage.Enabled = true; 
        btnPolicyForms.Enabled = true; 
        lblIsArchived.Text = ""; 
       } 

感謝, 〜CK

回答

3

那麼首先,如果你要使用的策略模式與接口,你可能希望這樣的接口。

public interface IStrategyUI 
{ 
    void Execute(); 
} 

那麼幾類你的邏輯

public class StatusAStrategy : IStrategyUI 
{ 
    public void Execute() 
    { 
     //implement 
    } 
} 

那麼你的if語句可以是工廠技術。

IStrategyUI logic; 

switch(someObject.Status) 
{ 
    case 'A': logic = new StatusAStrategy(); 
      //etc etc 

} 

logic.Execute(); 

或者您可以將此對象作爲接口返回並將switch語句封裝在另一個方法或工廠類中。

這樣你就可以像這樣使用它。

IStrategyUI logic = StrategyFactory.GetStrategy(status); 
logic.Execute(); 

這是給你的。

此外,我沒有在這裏使用遏制類,但你可以如果你想。

您也可以與代表這樣做。

圍堵類

class StrategyHolder 
    { 
     public Action Strategy { get; set; } 

     public void Execute() 
     { 
      if(this.Strategy != null) 
       this.Strategy(); 
     } 
    } 

不同的策略方法。

void EnableStatusA() 
{ 
    //do everything for status A 
} 

switch語句

StrategyHolder logic = new StrategyHolder(); 

switch(someObject.Status) 
    { 
     case 'A': logic.Strategy = EnableStatusA; 
       //etc etc 

    } 

return logic; 

這個電話從外面。

StrategyHolder logic = StrategyFactory.GetStrategy(status); 
logic.Execute(); 
+0

謝謝斯坦。在實現中的execute方法中,如何獲得對頁面控件的引用?我是否通過推薦網頁並執行findcontrol('someId')?或者,還有更好的方法? – Hcabnettek 2009-07-21 16:44:31

+0

是的,你可以傳遞一個引用到頁面本身,然後做同樣的事情你以前做的事情,即page.lblIsArchived.Text =「」;等等。你可以在構造函數或Execute方法中傳遞頁面的引用。隨你便。 – 2009-07-21 17:03:59

3

如果所有的按鈕,得到相同的實現無論狀態,在你的榜樣,那麼我會隱藏在離開按鈕的列表,只是在它們之間迭代。然後,您的策略參數歸結爲一個布爾值和一個字符串 - 並且很容易做到這一點。如果它有更大的複雜性,那麼實現一個設置控件的接口的不同類將會是有序的,可能有一個抽象超類來保存整體邏輯。

0

我認爲你要找的是State彭定康。這與戰略模式類似,不同之處在於每個狀態對象通常在創建時被賦予對上下文對象的引用(在你的情況下這是表單)。這允許不同的狀態對事件做出響應來處理上下文對象。

實現狀態模式通常更適合使每個獨立狀態從抽象基類繼承。然後,基類可以在虛擬方法中實現默認操作,然後您只需重寫每個狀態不同的操作。

public interface IFormState 
{ 
    void EnableDisableControls(); 
} 

public class DefaultState : IFormState 
{ 
    private MyForm context; 

    public DefaultState(MyForm context) 
    { 
     this.context = context; 
    } 

    protected MyForm Context 
    { 
     get 
     { 
      return this.context; 
     } 
    } 

    public virtual void EnableDisableControls() 
    { 
     this.context.btnRecordCall.Enabled = true; 
     this.context.btnAddMailOrStatusAction.Enabled = true; 
     this.context.btnPayments.Enabled = true; 
     this.context.btnAddressMaint.Enabled = true; 
     this.context.btnFilter.Enabled = true; 
     this.context.btnAddCoverage.Enabled = true; 
     this.context.btnPolicyForms.Enabled = true; 
     this.context.lblIsArchived.Text = ""; 
    } 
} 

public class StateA : DefaultState 
{ 
    public StateA(MyForm context) 
     : base(context) 
    { 
    } 

    public override void EnableDisableControls() 
    { 
     base.EnableDisableControls(); 

     this.Context.lblIsArchived.Text = "********** THIS CLAIM HAS BEEN ARCHIVED **********"; 
     // etc... 
    } 
}