[英]Design pattern to accommodate two different ways of handling a Winform's functions
我有一个WinForm
,用于构建和测试电子邮件通讯。 该表单包含许多方法和事件。
现在,我在程序中添加了一项新功能,以允许进行拆分测试(A / X测试),因此最多可以为一个广告系列创建4个不同的新闻通讯。
因此,我想扩展我的表格以容纳普通新闻通讯和A / X新闻通讯。 我将向表单添加两种不同的模式。 就像是:
private enum CampaignMode { Normal, AxTest };
它们的外观将非常相似,不同之处在于许多控件的可见性将发生变化。
除此之外,几乎所有的方法和事件都有两种单独的处理方式。
我应该使用哪种设计模式,而不必创建新的单独表单?
为了简单起见,假设我的表单具有以下方法:
EditMode
作为参数 EditMode
设置控件的可见性 Normal
模式 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.