《领域模型》——设计模式应用于模型(二)
模式:Composite(组合模式)
将对象组织为树结构来表述部分-整体的层次结构。利用Composite,客户可以对单独的对象和对象组合进行同样的处理。
在对复杂的领域进行建模时,我们经常会遇到由多个部分组成的重要对象,而这些部分本身也是由其他对象组成,有时甚至会出现任意深度的嵌套。在一些领域中,各个嵌套层的概念是由区别的,但是在另一些领域中,组成和组成的整体是完全相同的事情,只是规模较小。
当嵌套容器的关联性没有在模型中反映出来时,公共行为必然会在层次结构的每一层重复出现,而且嵌套也变得僵化(如容器通常不能包含同一层中的其他容器,而且嵌套的层数也是固定的)。客户必须通过不同的接口来处理层次结构中的不同层,金光这些层可能在概念上是没有区别的。通过层级结构来递归的收集也变得非常复杂。已递归方式在一些相关对象中导航确实比较方便,但他们是否真的存在整体-部分层次结构?当你发现可以通过某种抽象方式把所有部分都跪在同一概念中时,使用组合可以让这些部分变得更清晰。因此定一个把组合内所有成员都包含在的抽象类型,在容器上实现一些用来查询信息的方法,这些方法可以收集与容器相关的信息。“叶”节点基于它们自己的值来实现这些方法。客户只需使用抽象类型,而无需区分“叶”和容器。
示例:由Route构成的shipment Route(由航运构成的航运路线)
完整的航段有多个航段组成,一开始开发人员以为航段之间没有区别,但是事实上领域专家把航线堪称由5个逻辑段组成的一个序列起点门à出港联运à深海à入港联运à终点门,这些小段的航线可能是由不同的人在不同时间规划的,因此必须认识到他们之间是有区别的。通过更仔细的研究可以发现“门航段(door leg)”与其他航段大不相同,他涉及在当李雇佣卡车甚至客户运输,这与详细计划的铁路和货船运输完全不同。
从上面的结构看这个模型不算很差,但是在操作计划的处理上失去了一致性,任何一条航线的遍历都涉及不同类型对象的集合。
运用Composite模式能使特定客户在不同层上都是用这种结构进行统一的处理,因为大的航线是由小段航线构成的,这种视图在概念上也是合理的,每一层Route都是集装箱从一个地点到另一个地点的移动,最后可以归结为一个独立的航段。
与前面的不同,这个模型抓住了所有这些不同类型的Route的深层关联性,生成操作计划的工作再次变得更简单了,而且其他路线的遍历也变得更简单了。利用这种有“航线组成航线”的方法,我们可以把各个航线的断电连接到一起从而实现不同的航线。通过截取再拼接得到新沆瀣,可以有任何细节的嵌套,而且可以充分利用一切可能有的选项。
组合模式的概念对象是由其他概念对象组成的,这使得组合模式既适用于模型也适用于实现,这是领域模型的一个基本特征。
把设计模式作用于领域模型的唯一要求是这些模型能够描述关于“概念领域”的一些事情,而不仅仅是作为解决技术问题的技术解决方案