我应该将哪种设计模式用于动态报告生成器?

时间:2014-04-01 14:09:27

标签: c# design-patterns

我是设计模式的新手。即使研究很多,我也无法理解我应该何时使用哪种设计模式。我的问题是:在Web应用程序上下文中,我应该使用哪种设计模式来实现如下所示的报告生成器?

================================================== =====
报告类型: | '选择列表'这里 |
报告子类型: | 另一个选择'列表' |

过滤器: | 许多选择,许多过滤参数 | ================================================== =====

报告类型和子类型允许用户生成多种报告,一种不同,但过滤器对所有报告都是相同的(但并非所有过滤器值都将用于所有报告或对所有报告都有效)。我正在使用C#。我已经看过另一个关于选择设计模式的问题,但没有成功。我应该使用哪种设计模式? 在此先感谢大家:D。 (注意:我已经将这个问题用于研究目的)

2 个答案:

答案 0 :(得分:6)

设计模式不是为了让您选择一个来用于应用程序。设计模式是有用的工具,可以帮助您构建组成应用程序的组件。最好的方法是开始开发您的应用程序,无论您发现代码变得笨拙或难以理解,请查看您对模式的了解,看看是否有一些有助于改善您的模式的想法码。随着您获得经验,您会发现自然地使用模式来避免代码问题。

答案 1 :(得分:4)

我同意这里的所有评论,即设计模式本身不是目标,它们是工具。您的TA / prof通过使某个特定任务需要给定的设计模式看起来错误的想法。

除此之外......

自己实施Factory。您的工厂将生成可用的IReport列表,并可能返回一些有关它们的元数据。

public class ReportData{
}

public class ReportResult{
}

public class ReportOptions{
}

public class ReportSubtype{
}

public interface IReport{
  string Name{get;}
  string[] ReportSubtype{get;}
  string[] ReportOptions {get;}

  ReportResult GetReport(ReportData data, ReportSubtype subtype, ReportOptions options);
}

public class ReportSample: IReport{
  //.... your implementation
}

public static class ReportFactory{  

  private IReport[] _reports = null; // cache the instances - optional

  public static IReport[] GetAvailableReports(){
    if (_reports==null)  // static definition can be replaced with dynamic loading
       _reports = new IReport[]{
                    new ReportSample(),
                  };

    return _reports;
  }
}