加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 战略模式 – 正确实施

发布时间:2020-12-16 01:41:15 所属栏目:百科 来源:网络整理
导读:我是第一次使用这种模式,并使用C#. 我只想检查这是否是正确的实现. 我在Winform上有一个按钮,当点击它时会输出一些特定格式的数据,通过从下拉框中选择来定义.现在这可能会在未来发生变化,因此我使用策略模式来封装哪些变化. 我有一个“策略接口”,它只是暴露
我是第一次使用这种模式,并使用C#.

我只想检查这是否是正确的实现.
我在Winform上有一个按钮,当点击它时会输出一些特定格式的数据,通过从下拉框中选择来定义.现在这可能会在未来发生变化,因此我使用策略模式来封装哪些变化.

我有一个“策略接口”,它只是暴露了一种方法:“显示数据()”.

在我的按钮上单击我使用以下代码:

private void ConfirmButton_Click(object sender,EventArgs e)
    {
        IViewData viewData;

        switch (outputMedia)
        {
            case "Excel":
                viewData = new ExcelOutput(operation,study);
                viewData.DisplayData();
                break;
            case "Spotfire":
                viewData = new SpotfireOutput(operation,study);
                viewData.DisplayData();
                break;
        }


    }

这是使用这种模式的可接受方式吗?显然,如果识别出额外的输出媒体,那么我将简单地创建一个新的子类并在switch语句中添加一个额外的“case”.

谢谢.

解决方法

使用策略的正确方法是将IViewData对象的创建与其用法分开.创建本身可能由工厂方法处理.然后你可以在一个单独的位置使用创建的IViewData,它完全没有意识到对象的具体类.

例如.

private IViewData CreateViewData()
{
    IViewData viewData;

    switch (outputMedia)
    {
        case "Excel":
            viewData = new ExcelOutput(operation,study);
            break;
        case "Spotfire":
            viewData = new SpotfireOutput(operation,study);
            break;
    }
    return viewData;
}

...

private void ConfirmButton_Click(object sender,EventArgs e)
{
    IViewData viewData = CreateViewData();

    viewData.DisplayData();
}

现在,通过重构工厂方法,您可以进一步改进解决方案.您可能决定使用Dictionary而不是switch,或者只创建一次视图数据对象并缓存它们,或者(如您所建议的)用依赖注入替换它…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读