我是第一次使用这种模式,并且使用的是 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/