有没有这样的设计模式

时间:2011-10-27 05:46:25

标签: design-patterns

我有以下域名,一份包含文件的档案:

-Dossier(Name,Documents[])
-Document(Name)

现在对于一些有主题且每个主题都有文档的档案有一个新的要求,所以新域名将是这样的:

-Dossier(Name,Subjects[])
-Subject(Number,Documents[])
-Document(Name)

对于这些少数档案(7%),我必须为更复杂的设计改变一个简单的设计。我的问题是:我可以使用一种设计模式或任何想法来支持主题,但避免更改初始域。

3 个答案:

答案 0 :(得分:1)

您可以保留从Dossier到 主题 文档集合的参考/链接(所以它将是-Dossier(Name,Documents [],Subjects []))并在DB / Programming语言级别上实现一些验证规则,例如:当 的集合在中为空时档案,这个档案不能有任何文件 Documents 的集合必须为空)。这样,您只需附加更改模型,而无需实际修改或移除任何现有内容。

或者,您可以创建一个基类 Dossier ,它具有名称和两个子类: DossierWithSubject (带有主题集合)和 DossierWithoutSubject (带有收集文件),后者正是你到目前为止所拥有的。因此,只需将您当前的档案作为DossiersWithoutSubject制作/处理。

希望这一切都有帮助。

答案 1 :(得分:1)

我认为您正在寻找Decorator Pattern

您可能还会在此处找到Composite PatternDelegation pattern

答案 2 :(得分:0)

选择模式时需要考虑很多事项

如果设计根据Dossier consoder 委托模式(wiki)外部的上下文动态变化。

如果在“构建”或“初始化”阶段设置此项,您可以考虑 pimpl www.codeproject.com)或装饰器({{3模式

或者你可能需要不同的东西......

选择的解决方案应该取决于您需要解决的确切问题。 两个简单的规则是:

  1. 支持组成代替继承
  2. 封装可变性
  3. 1)意味着委托工作到组件。每个cpmponent应该做“一件事”,但做得很好。

    2)表示系统中是否存在可能发生变化的部分 - 将其封装在单独的实体中

    对于设计模式中的介绍材料,我可以推荐“四人帮”一书“wiki