我有一个WinForm,我用它来构建和测试电子邮件通讯。此表单包含许多方法和事件。
我现在增加了一个新的功能,我的程序允许分裂测试(A/X测试),因此创建多达4个不同的时事通讯为一项运动。
因此,我想扩展我的表格,以适应正常的通讯和A/X通讯。我将在表单中添加两种不同的模式。类似于:
private enum CampaignMode { Normal, AxTest };它们的外观将非常相似,只是一些控件的可见度将发生变化。
除此之外,几乎所有的方法和事件都有两种不同的处理方法。
我应该使用什么设计模式,这样我就不必创建一个新的单独的表单了?
为了简单起见,假设我的表单有以下方法:
EditMode作为参数接收EditMode设置控件的可视性Normal模式AxTest模式发布于 2016-07-27 08:19:06
对于每个方法/事件,我只需要一对函数,然后让主处理程序调用适当的函数,这取决于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
乔纳森
发布于 2016-07-27 07:59:11
听起来模板法是个不错的候选人。
创建一个基类,负责基本初始化、Load()、Create()、SetControlViews()的逻辑,然后根据特定的逻辑在两个派生类中使Method()变为虚拟和覆盖。此外,每个派生类的构造函数都可以执行一些专门的初始化。
这样,您甚至不需要一个CampaignMode枚举(如果您的意思是相同的话,也不需要EditMode )。不同的派生类的存在说明了不同实体的存在性。
https://stackoverflow.com/questions/38606880
复制相似问题