首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于处理Winform函数的两种不同方法的设计模式

用于处理Winform函数的两种不同方法的设计模式
EN

Stack Overflow用户
提问于 2016-07-27 07:47:00
回答 2查看 58关注 0票数 2

我有一个WinForm,我用它来构建和测试电子邮件通讯。此表单包含许多方法和事件。

我现在增加了一个新的功能,我的程序允许分裂测试(A/X测试),因此创建多达4个不同的时事通讯为一项运动。

因此,我想扩展我的表格,以适应正常的通讯和A/X通讯。我将在表单中添加两种不同的模式。类似于:

代码语言:javascript
复制
private enum CampaignMode { Normal, AxTest };

它们的外观将非常相似,只是一些控件的可见度将发生变化。

除此之外,几乎所有的方法和事件都有两种不同的处理方法。

我应该使用什么设计模式,这样我就不必创建一个新的单独的表单了?

为了简单起见,假设我的表单有以下方法:

  1. 构造函数:可能将EditMode作为参数接收
  2. 负载
  3. 创建:按钮单击事件
  4. 基于SetControlViews:的EditMode设置控件的可视性
  5. MethodA:特定于Normal模式
  6. MethodB:特定于AxTest模式
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-27 08:19:06

对于每个方法/事件,我只需要一对函数,然后让主处理程序调用适当的函数,这取决于CampaignMode的值。

代码语言:javascript
复制
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参数的可见性函数就更整洁了。

代码语言:javascript
复制
    private void SetNormalVisibility(bool isNormal)
    {
        //normalTextBox.Visible = isNormal;
        //normalButton.Visible = isNormal;
        //axTestTextBox.Visible = !isNormal;
        //axTestButton.Visible = !isNormal;
    }

在这种情况下,将SetControlsVisibility函数更改为:

代码语言:javascript
复制
    private void SetControlsVisibility()
    {
        if (campaignMode == CampaignMode.Normal)
        {
            SetNormalVisibility(true);
        }
        else
        {
            SetNormalVisibility(false);
        }
    }

HTH

乔纳森

票数 1
EN

Stack Overflow用户

发布于 2016-07-27 07:59:11

听起来模板法是个不错的候选人。

创建一个基类,负责基本初始化、Load()Create()SetControlViews()的逻辑,然后根据特定的逻辑在两个派生类中使Method()变为虚拟和覆盖。此外,每个派生类的构造函数都可以执行一些专门的初始化。

这样,您甚至不需要一个CampaignMode枚举(如果您的意思是相同的话,也不需要EditMode )。不同的派生类的存在说明了不同实体的存在性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38606880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档