需要c#设计模式的建议

时间:2015-07-12 12:05:12

标签: c# design-patterns

我刚开始学习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;

            // ...
        }
    }
}

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

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分: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 :(得分: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
    }

答案 2 :(得分:0)

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