繁体   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