c# - 策略模式-正确实现

标签 c# strategy-pattern

我是第一次使用这种模式,并且使用的是 C#。

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

我有一个“策略接口(interface)”,它只公开一个方法:“Display Data()”。

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

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”。

谢谢。

最佳答案

使用 Strategy 的正确方法是将 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,或者只创建一次 View 数据对象并缓存它们,或者(如您所建议的那样)用依赖注入(inject)替换它...

关于c# - 策略模式-正确实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4992294/

相关文章:

c# - C#中通过属性获取修饰成员的信息

c# - 在c#中从word文档中获取替换普通文本

ruby - 策略模式 - 定义某些(但不是全部)子策略中使用的方法的 DRY 方式

c# - 委托(delegate)如何使用通用且可扩展的类来响应多个事件?

design-patterns - 何时以及如何应用策略模式代替装饰器模式?

pine-script - Pinescript strategy.entry 多头/空头似乎被额外的 2 根蜡烛延迟

c# - 使用C#登录网站

c# - 漫游用户设置是否按客户端程序集版本保存?

c# - 使用 EPPlus 创建的 Excel 图表中的图例颜色不正确

solid-principles - 用策略模式重构,然后应用 SOLID 原则