簡體   English   中英

設計模式可容納處理Winform函數的兩種不同方式

[英]Design pattern to accommodate two different ways of handling a Winform's functions

我有一個WinForm ,用於構建和測試電子郵件通訊。 該表單包含許多方法和事件。

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

因此,我想擴展我的表格以容納普通新聞通訊和A / X新聞通訊。 我將向表單添加兩種不同的模式。 就像是:

private enum CampaignMode { Normal, AxTest };

它們的外觀將非常相似,不同之處在於許多控件的可見性將發生變化。

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

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

為了簡單起見,假設我的表單具有以下方法:

  1. 構造函數 :可能接收EditMode作為參數
  2. 加載
  3. 創建 :按鈕單擊事件
  4. SetControlViews :基於EditMode設置控件的可見性
  5. 方法A :特定於Normal模式
  6. 方法B :特定於AxTest模式

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

創建一個基本類,該類負責基本初始化的邏輯, Load()Create()SetControlViews() ,然后使Method()虛擬,並根據專用邏輯在兩個派生類中重寫。 同樣,每個派生類的構造函數都可以進行一些專門的初始化。

這樣,您甚至不需要CampaignMode枚舉(如果您EditMode它們相同,則不需要EditMode )。 通過存在不同的派生類可以說明不同實體的存在。

我將簡單地為每個方法/事件使用一對函數,然后讓主處理程序調用適當的函數,具體取決於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()
    {
    }
}

注意:如果有很多控件,那么擁有帶有bool參數的可見性功能就顯得更加整潔了:例如

    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

喬納森

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM