我有以下域名,一份包含文件的档案:
-Dossier(Name,Documents[])
-Document(Name)
现在对于一些有主题且每个主题都有文档的档案有一个新的要求,所以新域名将是这样的:
-Dossier(Name,Subjects[])
-Subject(Number,Documents[])
-Document(Name)
对于这些少数档案(7%),我必须为更复杂的设计改变一个简单的设计。我的问题是:我可以使用一种设计模式或任何想法来支持主题,但避免更改初始域。
答案 0 :(得分:1)
您可以保留从Dossier到 主题 和 文档集合的参考/链接(所以它将是-Dossier(Name,Documents [],Subjects []))并在DB / Programming语言级别上实现一些验证规则,例如:当 的集合在中为空时档案,这个档案不能有任何文件( Documents 的集合必须为空)。这样,您只需附加更改模型,而无需实际修改或移除任何现有内容。
或者,您可以创建一个基类 Dossier ,它具有名称和两个子类: DossierWithSubject (带有主题集合)和 DossierWithoutSubject (带有收集文件),后者正是你到目前为止所拥有的。因此,只需将您当前的档案作为DossiersWithoutSubject制作/处理。
希望这一切都有帮助。
答案 1 :(得分:1)
我认为您正在寻找Decorator Pattern。
您可能还会在此处找到Composite Pattern或Delegation pattern。
答案 2 :(得分:0)
选择模式时需要考虑很多事项
如果设计根据Dossier consoder 委托模式(wiki)外部的上下文动态变化。
如果在“构建”或“初始化”阶段设置此项,您可以考虑 pimpl (www.codeproject.com)或装饰器({{3模式
或者你可能需要不同的东西......
选择的解决方案应该取决于您需要解决的确切问题。 两个简单的规则是:
1)意味着委托工作到组件。每个cpmponent应该做“一件事”,但做得很好。
2)表示系统中是否存在可能发生变化的部分 - 将其封装在单独的实体中
对于设计模式中的介绍材料,我可以推荐“四人帮”一书“wiki