(同步自http://www.blogjava.net/AndersLin/archive/2006/06/11/51986.html)
将两个模式放在一起是因为无论是role还是product:
不仅仅是体现了OO的SRC原则,当一部分逻辑够复杂时,就分离出去成为新层次。
而且在于,我认为在一些情况下,责任模式是合同模式的一个特例。
第一个是责任模式。
也许更应该陈作party模式。在这个章节中,详细讨论了party,hierachy,以及与party相关联的概念,包括address,责任。
在party模式中,一个party的责任是由他所在hierarchy和role构成的。
同时责任又被具体化为操作范围:由一些term(借用了合同一章中的term)或者一系列term组成的。
如同观测和测量模式一样,这些term也分定性的和定量的。不过martin没有深入讨论责任的子类型化。
最后一系列的责任映射到Role,正如我们习惯和熟悉了的那样:
一个role包含了相关的一系列操作范围,从外部看,我们看到了一个完整的概念。
第二个是合同模式(包括合同,派生合同等3个章节)
讨论了:合同和产品关系(产品模型是如何被建立的),场景模型建立意图,合同(产品)的子类型化问题以及合同的外观问题。
合同的概念包括:场景,产品和团体。
场景的概念相当于rule engine中的fact,是一系列事实的集合。
产品模式来自于:The product/contract split should be used whenever the customer sees a single deal that is broken int servral deals by the trader.
我以为这个contract和product的关系,与party和role的关系很类似。
表面上看前者是include的关系,而后者不是,更多的,role修饰了party。
然而他们还是有些类似:
1. 首先product和role都可以独立于contract和party之外独立发展(废话一句:))
2. product本身是抽象的,并非代表一个现实世界的实物(还是废话一句)。。
考虑金融市场下的,一个金融产品来说,金融产品是虚拟的,它本身就是一个合同,包含了一系列的操作范围--责任。
注意在这个情况下:一个product包含了一系列的操作范围--责任,从外部看,也呈现了一个完整的概念。而这与role的结构是很像的。
虽然contract和product很自然的看成是include的关系,然而由于product本身是个完整的概念,
使得我们可以反过来看,product修饰了contract。
一个保单包含了不同的party,而保单中的保险产品修饰了保单--描述了不同party的责任关系。
(在强迫自己把两个本来"不大关系"的东东看成一致后:))
party中的责任模型中role相对静态,即role建立后其操作范围基本不变了。
而contract中的prodcut则是一个动态的概念:
即虽然product在定义层面已经规定了大量的责任关系(操作范围),当这些product被包含到contract中,通常会被参数化(子类型化),
当然也有没有被参数化的情况,可以看作一个特列。