2016-07-27 51 views
2

我有一個WinForm,我用它來構建和測試電子郵件通訊。該表格包含許多方法和事件。設計模式,以適應兩種不同的方式處理Winform的功能

我現在在我的程序中添加了一項新功能,可以進行分割測試(A/X測試),因此可以爲一個廣告系列創建最多4種不同的時事通訊。

因此,我想擴展我的表格,以適應正常的通訊和A/X通訊。我要爲我的表單添加兩種不同的模式。例如:

private enum CampaignMode { Normal, AxTest }; 

除了一些控件的可見性會改變外,它們在外觀上會非常相似。

除此之外,幾乎所有的方法和事件都會有兩種不同的處理方式。

我應該使用哪種設計模式,以便我不必創建新的單獨表單?

爲了簡單起見,假設我的形式有以下幾種方法:

  1. 構造:可能收到EditMode作爲參數
  2. 負載
  3. 創建:按鈕的Click事件
  4. SetControlViews:Based在EditMode的控制
  5. 治法能見度設置:具體到Normal模式
  6. 方法b:具體到AxTest模式
+0

你有沒有考慮過像MVP這樣的東西?表單可以抽象爲視圖界面,​​然後有兩個實現(演示者?)。 –

+0

@DavidOsborne問題是,這種形式只是大程序的一小部分。在開始時應用'MVP'可能會很好。但我想,除非我對程序進行徹底改革,否則部分應用框架對我沒有任何好處。 – Disasterkid

+2

不一定。您仍然可以採用IView概念並擁有兩個「可插拔」實現。它不需要嚴格的MVP爲您創建一個整潔的SOLID解決方案。 –

回答

1

對於每個方法/事件,我只需要有一對函數,然後根據CampaignMode的值調用相應的主處理函數。

public enum CampaignMode { Normal, AxTest }; 
public partial class DemoForm : Form 
{ 
    private CampaignMode campaignMode; 
    public DemoForm(CampaignMode mode) 
    { 
     InitializeComponent(); 
     campaignMode = mode; 
     SetControlsVisibility(); 
    } 
    private void SetControlsVisibility() 
    { 
     if (campaignMode == CampaignMode.Normal) 
     { 
      //Set normal controls visible; 
      //Set axtest controls invisible; 
     } 
     else 
     { 
      //Set normal controls invisible; 
      //Set axtest controls visible; 
     } 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     if (campaignMode == CampaignMode.Normal) 
     { 
      MethodA();     
     } 
     else 
     { 
      MethodB(); 
     } 
    } 
    private void MethodA() 
    { 
    } 
    private void MethodB() 
    { 
    } 
} 

注:如果有很多的控制,那麼它是整潔有一個布爾參數可見度函數:如

private void SetNormalVisibility(bool isNormal) 
    { 
     //normalTextBox.Visible = isNormal; 
     //normalButton.Visible = isNormal; 
     //axTestTextBox.Visible = !isNormal; 
     //axTestButton.Visible = !isNormal; 
    } 

在這種情況下,改變SetControlsVisibility功能:

private void SetControlsVisibility() 
    { 
     if (campaignMode == CampaignMode.Normal) 
     { 
      SetNormalVisibility(true); 
     } 
     else 
     { 
      SetNormalVisibility(false); 
     } 
    } 

HTH

喬納森

+0

我認爲這將最終成爲我所做的。 – Disasterkid

+0

當您添加更多'CampaignMode'時會發生什麼? –

+1

@Disasterkid所以你基本上正在努力'if/else'!每個閱讀你的問題的人都認爲你需要真正靈活的設計。我不會稱這個if/else的東西足夠靈活。這不是固體。接口是更好的方法。 – niksofteng

2

聽起來Template Method將是一個不錯的人選。

製作一個基類,它負責邏輯的基本初始化,Load()Create()SetControlViews()然後進行Method()根據專門邏輯虛擬和覆蓋在兩個派生類。另外,每個派生類的構造函數可以做一些專門的初始化。

這種方式你甚至不需要CampaignMode枚舉(或EditMode如果你的意思是相同的)。不同派生類的存在說明了不同實體的存在。

相關問題