战术模式简介

战术模式包含若干构造块模式,以便能够构建有效的领域模型。

战术模式严重依赖于领域模型和通用语言,通过技术模式将领域模型和通用语言中的概念映射到代码实现中。随着模型的进化,代码实现也会进行重构,以更好的体现模型概念。

当然,从技术重构角度也会发现一些隐含领域知识(概念),这些新的发现也会对领域模型产生影响。

战术模式和通用语言一样,都工作在特定限界上下文内,其应用边界受限界上下文的保护。

1 战术模式


战术模式的作用是管理复杂性并确保领域模型中行为的清晰明确。可以使用这些模式来捕获和传递领域中的概念、关系、规则。

每个构造块模式都具有单一职责:

1. 代表领域中的概念。如实体、值对象、领域服务、领域事件、模块等;

2. 用于管理对象的生命周期。如聚合、工厂、仓库等;

3. 用于集成或跟踪。领域事件、事件溯源等。

1.1 领域建模模式

他们表述实现与模型间的关系,将分析模型绑定到代码实现模型。主要用于在代码中表述模型元素的模式。

1.1.1 实体

实体表述的是领域中的概念,它是由身份而不是属性来定义的。

实体的身份标识在生命周期中保持不变,但其属性会发生变化。实体以身份标识作为唯一凭证,沿着时间轴,记录了实体所有变更事件。

实体的一个实例是产品,一旦产品被生成好,其唯一身份就不会发生变化,但是其描述信息、价格等可以被多次修改。

1.1.2 值对象

值对象代表仅通过数据区分的领域元素和概念。用作模型中元素的描述,它不具有唯一标识。

值对象不需要唯一标识,是因为它总是与另一个对象相关联,是在一个特定上下文中被解析的。通常,其生命周期会依附于它的关联对象(在这里,主要是实体对象)。

值对象会当做不变对象来设计,在完成创建后,其状态就不能改变了。

值对象比较好的例子就是现金,你无需关系货币的身份,只关心它的价值。如果有人用一张五美元钞票交换你的五张一美元钞票,也不会改变五美元本身。

1.1.3 领域服务

在模型中,领域服务封装了不能自然建模为值对象和实体的逻辑、流程和概念。

它本身不具有身份和状态。它的职责是使用实体和值对象编排业务逻辑。

领域服务的一个好例子是运输成本计算器,只要给出一组拖运货物和重量,它就能计算运输成本。

1.1.4 模块

模块主要用于组织和封装相关概念(实体、值对象、领域服务、领域事件等),这样可以简化对较大模型的理解。

应用模块可以在领域模型中促成低耦合和搞内聚的设计。

模块作用于单个领域,用于分解模型规模。子域用于限定领域模型适用范围(有界上下文)。

1.2 对象生命周期模式

相对来说,之前提到的模式重点在于表达领域概念。而对象生命周期模式,有点侧重于技术,用于表示领域对象的创建和持久化。

1.2.1 聚合

实体和值对象会相互协作,形成复杂的关联关系。我们需要在满足不变条件的前提下,将其拆分为一个个概念上的整体。

通常,面对复杂的对象关系,在执行领域对象操作时,难以保证一致性和并发性。

领域驱动设计由聚合模式来确保操作的一致性和事务的并发边界。大模型会通过不变性条件来划分,并组成概念化整体的实体和对象组,这个概念化整体便是聚合。

聚合根之间的关系应该通过保持对另一个聚合根 ID 的引用,而非对对象本身的引用来实现。这一原则有助于保持聚合之间的边界并避免加载不必要的对象。

不变性,是在领域模型中强制实现一致性的规则。无论何时对实体或聚合进行变更都要应用该业务规则。

聚合外部的对象只能引用另一个聚合的聚合根,聚合中对象的任何变更都需要通过聚合根来完成。聚合根封装聚合数据并公开行为以对其进行修改。

1.2.2 工厂

如果实体或值对象的创建过程非常复杂,可以将其委托给工厂。工厂会确保在领域对象使用之前就满足所有的不变条件。

如果领域对象很简单并且不具有特殊的不变条件,可以使用构造函数代替工厂。当从持久化存储中重建领域对象时,也可以使用工厂。

1.2.3 仓库

仓库主要用于持久化一个聚合。将聚合作为原子单元进行处理,因此,仓库操作的最小单元就是聚合,每个聚合会对应一个仓库。

仓库是用来检索和存储聚合的机制,是对基础框架的一种抽象。

1.3 其他模式

1.3.1 领域事件

领域事件表示问题空间中发生了一些业务人员关心的事情。主要用于表示领域概念。

使用领域事件主要有以下两种场景:

记录模型的变更历史;

作为跨聚合通信方式。

1.3.2 事件溯源

传统的仅快照式持久化的一个替代项便是事件溯源。作为实体状态存储的替代,可以存储引发该状态的系列事件。

存储所有的事件会提高业务的分析能力,不仅可以得知实体当前状态,还可以得知过去任意时点的状态。

1.4 总结

实体

1. 由唯一标识符定义

2. 标识符在整个生命周期保存不变

3. 基于标识符进行相等性检查

4. 通过方法对属性进行更新

值对象

1. 描述问题域中的概念和特征

2. 不具备身份

3. 不变对象

领域服务

1. 处理无法放置在实体或值对象中的领域逻辑

2. 无唯一标识

3. 无状态服务

模块

1. 分解、组织和提高领域模型的可读性

2. 命名空间,降低耦合,提供模型高内聚性

3. 定义领域对象组间的边界

4. 封装比较独立的概念,是比聚合、实体等更高层次的抽象

聚合

1. 将大对象图分解成小的领域对象群,降低技术实现的复杂性

2. 表示领域概念,不仅仅是领域对象集合

3. 确定领域一致性边界,确保领域的可靠性

4. 控制并发边界

工厂

1. 将对象的使用和构造分离

2. 封装复杂实体和值对象的创建逻辑

3. 保障复杂实体和值对象的业务完整性

仓库

1. 是聚合根在内存中的集合接口

2. 提供聚合根的检索和持久化需求

3. 将领域层与基础实施层解耦

4. 通常不用于报告需求

领域事件

1. 业务人员所关心的事件,是通用语言的一部分

2. 记录聚合根的所有变更

3. 处理跨聚合的通信需求

事件溯源

1. 使用历史事件记录替换快照存储

2. 提供对历史状态的查询

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,490评论 1 11
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,951评论 6 13
  • 文/图:夕颜1977 或许,我们都曾在内心呼唤一个名字,关于谁?可能是爱人,可能是孩子,可能是父母……一些过往,一...
    夕颜1977阅读 765评论 0 0
  • 很多想要进入游戏行业成为游戏UI设计师的年轻人都思索过同样的问题:怎样才能成为一个合格的游戏UI设计人员?要读什么...
    触控未来教育阅读 1,244评论 0 1