2015-07-12 234 views
0

我刚刚开始学习C#中的设计模式。需要c#设计模式的建议

我有两个组合框,并且当第一个组合框选择项被更改时,我需要更改第二个组合框的内容。 (而不是使用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; 

      // ... 
     } 
    } 
} 

有人可以帮我申请一个设计模式吗?我真的很想学习如何在我的项目中实现设计模式。

任何帮助将不胜感激!

回答

2

我没有为我的建议设计一个名称。但这里是我现在可以考虑的最好的设计:)

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()); 
} 
1

看一看策略模式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 
    } 
0

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