区别
设计模式与领域模式之间的区别?
设计模式可以认为是对一些交互的对象和类的描述,我们通过定制这些对象和类来解决特定上下文中的设计问题。《设计模式》中的设计模式把相关设计元素归为一类,这些元素能够解决在各种上下文中经常遇到的问题。这些模式的动机以及模式本身都是从纯技术角度描述的。但这些元素中的一部分在更广泛的领域和设计上下文中也适用,因为这些元素所对应的基本概念在很多领域中都会出现。
策略模式
通常,作为设计模式的STRATEGY侧重于替换不同算法的能力,而当其作为领域模式时,其侧重点则是表示概念的能力,这里的概念通常是指过程或策略规则。
示例 路线查找(Route-Finding)策略
Routing Service的职责是构造一个满足SPECIFICATION的详细的Itinerary。这个SERVICE是一个优化引擎,可以通过调节它来查找最快的路线或最便宜的路线。
通过策略模式进行改进模型:
现在,领域中的一个至关重要的规则明确地显示出来了,也就是在构建Itinerary时用于选择Leg的基本规则。它传达了这样一个知识:路线选择的基础是航段的一个特定属性(有可能是派生属性),这个属性最后可归结为一个数字。这样,我们就能够通过领域语言很简单地定义Routing Service的行为:RoutingService根据所选的STRATEGY来选择Leg总规模最小的Itinerary。
我们在领域层中使用技术设计模式时,必须认识到这样做的另外一种动机,也是它的另一层含义。当所使用的STRATEGY对应于某种实际的业务策略时,模式就不再仅仅是一种有用的实现技术了。
组合模式
当在领域中应用任何一种设计模式时,首先关注的问题应该是模式的意图是否确实适合领域概念。以递归的方式遍历一些相互关联对象确实比较方便,但它们是否真的存在整体—部分层次结构?你是否发现可以通过某种抽象方式把所有部分都归到同一概念类型中?如果你确实发现了这种抽象方式,那么使用COMPOSITE可以令模型的这些部分变得更清晰,同时使你能够借助设计模式所提供的那些经过深思熟虑的设计及实现的考量。
示例 由Route构成的Shipment Route
完整的货物运输路线是很复杂的。首先,必须用卡车把集装箱运输到铁路终点站,然后运送到港口,之后用货轮运输到另一个港口,中间可能还会换船,最后还要进行地面运输才能到达目的地。
修改后的领域模型图:
利用组合设计模式,重构后的领域模型图:
总结
把设计模式用作领域模式的唯一要求是这些模式能够描述关于概念领域的一些事情,而不仅仅是作为解决技术问题的技术解决方案。