【问题标题】:Need suggestions with c# design patterns需要有关 c# 设计模式的建议
【发布时间】:2015-07-12 12:05:12
【问题描述】:

我刚刚开始学习 C# 中的设计模式。

我有两个 ComboBox,当第一个 ComboBox 选定项发生更改时,我需要更改第二个 ComboBox 的内容。我无法在此处应用设计模式,而不是使用 Switch 语句(我假设的工厂设计模式 - 从我目前阅读的内容来看)。

class SomeClass
{
    private const string CONST_LANG_1 = "LANGUAGE_1";
    private const string CONST_LANG_2 = "LANGUAGE_2";
    private const string CONST_LANG_3 = "LANGUAGE_3";
    private const string CONST_LANG_4 = "LANGUAGE_4";
    // ...

    private const string CONST_LANG_1_SPK_1 = "SPEAKER_1_1";
    private const string CONST_LANG_1_SPK_2 = "SPEAKER_1_2";
    private const string CONST_LANG_2_SPK_1 = "SPEAKER_2_1";
    private const string CONST_LANG_2_SPK_2 = "SPEAKER_2_2";
    private const string CONST_LANG_3_SPK_1 = "SPEAKER_3_1";
    private const string CONST_LANG_3_SPK_2 = "SPEAKER_3_2";
    private const string CONST_LANG_4_SPK_1 = "SPEAKER_4_1";
    private const string CONST_LANG_4_SPK_2 = "SPEAKER_4_2";
    // ...

    private void cmbSelectLanguageDEMO_SelectedIndexChanged(object sender, EventArgs e)
    {
        switch( cmbSelectLanguageDEMO.SelectedIndex )
        {
            case 0: // CONST_LANG_1 -> Populate cmbSelectSpeakerDEMO
                break;

            case 1: // CONST_LANG_2 -> Populate cmbSelectSpeakerDEMO
                break;

            // ...
        }
    }
}

有人可以帮我在这里应用设计模式吗?我真的很想学习如何在我的项目中实现设计模式。

任何帮助将不胜感激!

【问题讨论】:

    标签: c# design-patterns


    【解决方案1】:

    我的建议设计没有名称。但这是我目前能想到的最好的设计:)

    interface Lang {
        void List<String> speakers();
    }
    
    class Lang1 : Lang {
        public override void List<String> speakers() {
            return ...;
        }
    }
    
    class Lang2 : Lang {
        public override void List<String> speakers() {
            return ...;
        }
    }
    
    List<Lang> langs = new List<>();
    int idx = 0;
    langs[idx++] = new Lang1();
    langs[idx++] = new Lang2();
    
    private void cmbSelectLanguageDEMO_SelectedIndexChanged(object sender, EventArgs e) {
        cmbSelectSpeakerDEMO.Items.AddRange( langs[cmbSelectLanguageDEMO.SelectedIndex].speakers() );
    }
    

    【讨论】:

      【解决方案2】:

      看看策略模式https://en.wikipedia.org/wiki/Strategy_pattern

          private void cmbSelectLanguageDEMO_SelectedIndexChanged(object sender, EventArgs e)
          {
              Action[] selectLanguageStrategies = {LoadLang1, LoadLang2 };
              selectLanguageStrategies[cmbSelectLanguageDEMO.SelectedIndex]();
          }
      
          private void LoadLang1()
          {
              // CONST_LANG_1 -> Populate cmbSelectSpeakerDEMO
          }
      
          private void LoadLang2()
          {
              // CONST_LANG_2 -> Populate cmbSelectSpeakerDEMO
          }
      

      【讨论】:

        【解决方案3】:

        不确定响应是否迟到。也许它对寻找类似解决方案的人有用。 我觉得观察者模式可能是您正在寻找的。如果您有一个对象的状态变化应该通知其他对象,那么您使用观察者模式。这里是一个简短的概述Observer design pattern

        【讨论】:

          猜你喜欢
          • 2014-03-30
          • 2013-11-26
          • 1970-01-01
          • 1970-01-01
          • 2010-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多