嵌套抽象和开放原则

时间:2017-10-05 13:25:45

标签: oop design-patterns solid-principles open-closed-principle

我即将实现文档生成器。我坚持遵循开放原则,这给我带来了一些麻烦。要求如下:

  • 会有多种文件类型(即协议,授权书)
  • 将有多种文档格式(即XML,JSON,HTML,PDF)
  • 每种文档类型都需要在文档上显示不同的数据集(即客户详细信息,详细信息)

由于我选择了以下开放 - 封闭原则,我强烈希望避免使用switch语句。这意味着我需要为特定类型的文档和格式类型引入一些抽象和实现。

是否有必要提供m x n类实现,其中m是文档类型的数量,n是文档格式的数量?我觉得这是错误的做法。请问,请给我一些提示,如何正确设计这样的文件生成器?

2 个答案:

答案 0 :(得分:0)

由于每种格式的行为完全不同,好的设计是通过实现一个通用界面为每个格式创建不同的类,比如说“IFormatter”。您可以注入界面' IFormatter'到需要调用文档格式化程序的客户端类。您可以通过不同方式负责对象创建。一个是简单的工厂方法(我个人不是工厂方法的忠实粉丝)。另一种方式是责任链。当匹配发现它将创建相应的对象时,您可以链接对象创建。

无论哪种方式,一旦构建了客户端类,您将永远不需要再次修改它。如果您想将文档格式化为另一种格式,那么就像通过实施IFormatter'来创建新类一样简单。接口

答案 1 :(得分:0)

我会给你一些提示

  • 如果每种文档类型至少使用一种不同的概念并且具有不同的业务约束,则为每种类型创建一个类。不要为DRY出汗。唯一可重用的应该是用于封装文档每个细节的值对象。
  • Html,PDf等是导入/导出格式。充其量,与实际文档关联的元数据。如果它很重要,您可以拥有像FormattedContent这样的Value对象,它有2个属性: Format Content

关于switch ..你有相当奇怪的约束。但你可以使用字典而不是开关!也许是抽象工厂。