我应该使用哪种设计模式?

时间:2012-01-10 16:54:32

标签: c# design-patterns

我有一个逻辑,我需要根据类型执行一次或多次(在循环中)。策略模式在这里有意义吗?实质上:

if (type == 1)
{
   ProcessReport("");
}
else if (type == 2)
{
   for (int i = 0; i < numUsers; i++)
   {
     ProcessReport(userId);
   }
}

public void ProcessReport(string id)
{
   if (id == "")
   {
     //Send full report
   }

   else
   {
     GetReportFragment();

     //Send report
   }
}

6 个答案:

答案 0 :(得分:4)

好吧,因为你显然使用“类型代码”来区分不同的行为,你可以从replacing it with subclasses (polymorphism)开始。当基于类型代码的分支时,这通常是第一件事。

然而,对于简单的问题,这可能是一种矫枉过正。您的代码更令人反感的是:

  • 为您的类型使用幻数:您至少应将其更改为枚举以提高可读性
  • 传递空参数"")以指示特定行为:如果您没有要指定的ID,则至少为“完整报告”创建单独的方法

答案 1 :(得分:2)

通常,策略模式定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端。

我没有看到任何值得添加另一层抽象的复杂算法

如果要封装ProcessReport行为,我会创建一个表示此行为的接口,以便您可以在循环中调用IProcessReport.Process(userId)

答案 2 :(得分:1)

根据type变量的语义,使用多态可能是有意义的。

鉴于当前的示例,它可能是开销(只有两个分支),但每次看到像if() ... else if() ... else if() ...switch() { case: ... }这样的结构时,您都不得不怀疑:有多少个条件分支?未来可能会出现新的吗?

根据这些问题的答案,我们可能决定进行Replace Conditional with Polymorphism重构。

答案 3 :(得分:0)

您的代码可以简化为:

if (type == 1)
    SendFullReport();
else if (type == 2)
    for (int i = 0; i < numUsers; i++)
        GetReportFragment(userId);

当然,您必须实施SendFullReport()GetReportFragment(string userId)方法。

在这种情况下使用复杂的设计模式毫无意义。

答案 4 :(得分:0)

那么,这只是一个例子,还是实际尺寸?我的意思是,如果你有两种类型,最好使用的模式是保持简单:)。

如果您有多种类型,那么您可以在那里制定策略,或者使用您想要执行的代码的字典类型委托/命令。

答案 5 :(得分:0)

我觉得战略模式是正确的解决方案,尽管当前功能有多么简单。一般来说,我会避免“如果&#39;语句并试图雾化我的代码。 Groo对代码&#39;气味的观察&#39;我也是。多态性(策略)似乎有点矫枉过正,但我​​宁愿采用稍微更抽象的解决方案,而不是试图根据希望为空或数字的字符串参数来改变函数的行为。