一、设计模式和领域驱动设计
设计模式是一种抽象的设计工具(脚手架)或者说抽象的手段,是软件设计中一些常用的方式方法的总结,是软件设计多年经验的总结出来的常用的解决方案。而领域驱动是更高一层的设计思想。那么从设计思想转到实际的过程中,实现的工具、手段或者方案就可以应用进来,这就是二者的关系。
但是,这并不代表所有的常用的设计模式都可以应用到领域驱动设计。同样,不同的设计人员对领域驱动设计和设计模式的理解有着千差万别的不同,其应用的过程一定也有着很多不一样的地方,所以要掌握一个明确的目的,设计模式是要为领域驱动设计服务的。
在领域驱动设计的对象和类的特定上下文设计中,可以采用一些设计模式的应用,特别是当这些设计模式能够对对象和类的交互有着较好的设计体现时,更是如此。在这个应用的过程中,正如可以从上向下看设计模式和从下向上看设计模式,也即从领域思想看设计模式和从代码开发的角度来看设计模式。这样就可以从概念和技术的两个方向更好的理解设计模式。
二、具体的应用
设计模式有二十几种,这里主要看组合和策略两模式:
1、组合(COMPOSITE)模式
组合模式是非常常见的一种设计模式,比如汽车,就是轮胎,发动机,车厢等的组合而成。在领域驱动设计中,在前面提到了领域根的一个概念,通过一个树形结构来描述整个对象实体的关系。利用COMPOSITE,客户可以对单独的对象和对象组合进行同样的处理。在实际的领域驱动设计过程中,特别是复杂对象的设计中,通常都是由多个对象来组成,这就可以应用到组合设计模式。
尤其是有些对象元素中引入了嵌套,而嵌套的设计一旦不清晰,无法把相关的模型关系很好的展示出来其公共的行为就会在不同的层次重复出现,那么,就会导致整个接口设计的内容的重复但是体现的概念基本相同。
而利用组合模式,就可以抽象化实体,将相同的行为接口抽象到同一个对象中,把多个不同属性的相同方法组合成一个新的对象对外提供接口,这样就可以更好的体现领域设计中的模型设计的概念和原则。
2、策略(STRATEGY)模式
策略模式的理解非常容易理解,其实就是把多种解决方式接口化抽象化。举一个实际的例子,在实际生活中的可换头的万用工具就是这种的典型应用;还有电饭锅的做饭多种模式,其实也是。策略,顾名思义,其实就是解决问题的方法,在实践的过程中,解决同一个问题的方法往往不只一种,这些方法在不同的场景下可能起到的作用大为不同。总不能为了实现同一个目的而生产一些完全相同的代码。
比如常见的地图查找路径算法里,就有用时最短,路径最短;如果采用不同的交通工具,又会有不同的策略。这些只是查找路径的一种手段不同,而其它都是一样的,共同的目的就是到达指定的地方。所以这就完全可以把相关的算法抽象出来一个策略接口,轻松来实现行为的动态转换。
但是在领域设计过程中,更倾向于对策略模式的概念的应用,它把策略做一种解决问题的基本规则抽象出来,这样就能保证领域设计中服务的解耦并减少上下文的开销。所以从这一点来看,虽然看待问题的角度不同,但最终解决问题的方式类似。具体的例子可以看一看经典的《领域驱动设计》这本书。
那么如何判断一个设计模式是否可以应用到领域设计呢?一个重要的原则就是它既可以在技术实现的层次应用又可以在模型设计的层次上应用。一般来说,设计模式一定是在技术实现层面上应用的,所以上面的意思其实就是设计模式可以在模型层次,也就是概念的角度上应用到领域驱动设计 。
三、总结
一个人学得越多,就会发现自己懂得越少。因为见识越多,会发现认知的领域太小了。于是会变得更谦逊,更原意接受新理念和新的思想。然后就越容易得到进步。在一个技术创新愈发艰难的时代里,天才式的人物凋零,但这并不代表不可以有其它模式的创新。比如今天提到的这种把多个层面的技术融合应用,有可能就会得到一种更好的设计效果。
要勇于尝试并将其践行,知易行难,不要做书呆子,只会在头脑中行动一下!