聚合(Aggregation):
这是一种松散的对象间的关系.举个例子:计算机和他的外围设备就是一例.
用来表示拥有关系或者整体与部分的关系。
组合(Composition):
这是一种非常强的对象间的关系,举个例子,树和它的树叶之间的关系.
在一个合成里,部分与整体的生命周期都是一样的。一个合成的新对象完全拥有对其组成部分的支配权。包括他们的创建和毁灭。
这两个非常的相似,
聚合:
• 聚合有时能够不依赖部分而存在,有时又不能
• 部分可以独立于聚合而存在
• 如果有一部分遗失,聚合会给人一种不完全的感觉
• 部分的所有权可以由几个聚合来共享,比如打印机
[通过接口设置]
组成:
• 部分某一时刻只能属于某一个组成
• 组成唯一的负责处理它的所有部分--这就意味着负责他们的创建与销毁
• 倘若对于部分的职责由其他对象来承担的话,组成也就可以放松这些职责。
• 如果组成销毁的话,它必须销毁所有的部分,或者把负责他们的权利转移给其他对象。
[通过代码组合]
模型驱动设计(Model-DrivenDesign)抛弃了分裂分析模型与设计的做法,使用单一的模型来满足这两方面的要求。这就是领域模型!
领域模型把分析和设计放在一起,单一的领域模型同时满足分析原型和软件设计,如果一个模型实现时不实用,重新寻找新模型。[只用单一的模型来满足分析与设计,不能满足就重新寻找模型]如何寻找模型?模型又是一个什么?
根据Eric的理论,业务层将细分为两个层次:应用层和领域层。
应用层:定义软件可以完成的工作,并且指挥具有丰富含义的领域对象来解决问题,保持精练;不包括业务规则或知识,无业务情况的状态;Action[这个代码更改的概率为0]
领域层:负责表示业务概念、业务状态的信息和业务规则,是业务软件核心。层次之间必须清晰分离,每个层都是内聚的,并且只依赖它的下层.[在领域层会建立模型,比如用户模型,保存了用户的所有属性,用户所有的功能,全部面向接口,依赖下层实现,也就是以抽象的方式建立模型,就也就是在分析和设计的时候设置的用户模型,比如以下类图]
分析与设计[设置顶级接口很重要]
用户顶级接口 User
UserInfo getUserInfo() --得到用户信息:用户属性
void Speak() --说话:用户功能
void Walk() --走路:用户功能
看到这里会不会觉得用户接口很简单,很简洁.[爆露给外部调用的方法,在设计的时候已经确定]
用户接口的功能内聚,用户模型保存用户属性,所有功能面向接口,依赖下层实现.
接口抽象类 AbstratorUser
UserInfo userInfo; --用户属性
//用户操作对象.
Abstrator UserOperator getUserOperator() –用户操作对象信息,依赖下层
//overwriter
Speak(){
getUserOperator ().Speak();
}
//overwriter
Walk(){
getUserOperator ().Walk();
}
//用户信息在初始的时候留给子类设置
Void setUserInfo(UserInfo userInfo){
This.userInfo=userInfo
}
//overwriter
UserInfo getUserInfo(){
Return userInfo;
}
[对业务逻辑的初步封装,蓝色部分是重写方法,而红色部分是需要依赖下层建筑的]
以上为设计阶段完成的,而下层建筑就交给开发工程师来完成,不同的开发工程师的水平和风格可能不一样,但是完全分离的方式使各模块[用户信息,用户操作]都能够正常运行,耦合为0. [这个代码更改的概率为0]
现在Action层代码更改为0,接口层和抽象层代码修改为0,那么当用户逻辑变的时候,只需要修改下层建筑就可以了!.
UserInfo为用户信息,这是一个实体类,其各对象的属性采用组合的方式来连接
Address,Account,Family.如果需要添加一些Friend等信息很方便,与其他模块不会有耦合.
UserOperator为用户操作对象,这是一个接口,依赖下层建筑.如果用户Speak的方式从中文变成英文了,只需要修改下层建筑就可以了.
这就是DDD,领域驱动开发,只依赖下层建筑,而下层建筑就是最简单的增删改查操作.也就是业务最需要变动的地方,领域驱动可以把一个项目分成一个域,而这个域能够包含这个项目的所有信息,其实DDD并不算新的技术,他只是提供了一个概率,分析与设计的组合可以把业务逻辑理清,减少上层建筑的缺陷,而下层建筑是可以随机换的,上层建筑一般是基本接口和抽象,只要业务逻辑没有分析出错,就不需要改动.而DDD把层分成两层,应用层和领域层,也是从整体考虑,应用层调用领域层的接口,其实领域层也可以分层,他只是让系统的策划更简单,不用考虑那么多层,系统都是从简单到复杂,这相当于数据挖掘技术,一张图很简单,再挖一下也很简单,再挖一下也很简单,应用不同的项目,不同的模块,基于接口和抽象的设计,并能从全局考虑就是DDD的思想.
现在来回答领域模型是什么:
领域模型是对领域内的概念类或现实世界中对象的可视化表示。
现实中的人 User
人的属性 getUserInfo()
人说话 Opertator.Speak()
人走路 Operator.Walk()
如何寻找模型:
在业务专家和设计专家一些交流的时候,设计专家能够从业务专家的描述中抽取出实体及实体间的关系[泛化、依赖和关联,关联又分了一般关联、聚合、组合等等]
分享到:
相关推荐
非常好和最为全面的DDD领域建模知识总结资料并包含了简单样例代码解读,该资料包含8个部分 1. 什么是DDD? 2. 为什么要使用DDD? 3. DDD核心概念 4. DDD需求分析、设计、开发流程 5. 基于微服务架构构建旅程 6. DDD...
DDD领域驱动设计&中台实践资料合集,共20份。 DDD促进传统架构微服务转型 化繁为简--DDD驱动复杂业务软件架构的演进 基于FP的DDD实践 基于DDD的领域建模中的模版和工具实践 架构分层模型适配 金融支付系统的改造之...
一个使用.net core开发的简单领域模型项目,可以参考学习
以DDD思想为基础的轻量级业务中台开发框架 用状态机封装领域逻辑 在一个实际复杂业务中落地DDD方法与相关架构 DDD促进传统架构微服务转型 DDD的为与不为 DDD实践中的那些坑 DDD在旅游电商架构演进中的实践 Every ...
DDD领域驱动设计到底是什么? DDD和传统三层优劣势比较 DDD在国内现象是个什么情况? DDD从战略设计到战术设计概览 第2章 领域分析模型 核心域,支撑子域,通用子域 微服务和DDD是什么关系? 传统模式下如何合理的...
xtoon引导基于DDD领域模型并支持SaaS平台的开发脚手架。|||为何选择xtoon-boot解决编写过程式和事务代码,造成后期维护逻辑混乱,维护成本高的痛点;抛弃MVC框架,拥抱更适合复杂业务的开发框架;网上基本讲的都是...
一个基于 DDD 领域驱动设计 CQRS 命令查询职责分离 的 .net core 框架,完全开源。ASP.NET Core 2.1 应用, 包含 DDD、CQRS 和事件回溯。
CongoMall(刚果商城)不一样的TOC商城系统,SpringCloud-Alibaba微服务架构设计,基于DDD领域驱动模型开发,代码设计优雅,涵盖商城核心业务。系统集成分布式锁、分布式事务、分库分表、消息队列、数据搜索、服务...
基于Golang语言结合领域驱动设计(DDD) 实现o2o业务模型项目源码,支持线上商店,线下门店;多渠道(商户)、多门店、商品、规格SKU、快照、订单、促销、支付、配送等功能
收集来自主流的DDD开发理论知识培训课程,包括: 领域驱动设计简介 领域通用语言 领域驱动设计的构造块 领域驱动设计编程实践 CQRS架构 模型驱动开发
在系统开发中,“模型”一词意味着许多事情 :流程上的UML图表,数据如何在数据库表格中布局,以及许多其他内容。在DDD中,我们使用“模型”一词来解释我们如何捕捉我们对手头业务的基本理解,提炼成一组选定的概念...
领域模型的职责是实现业务逻辑,如果领域模型只是用来处理简单的逻辑(比如贫血模型),那么领域模型的作用微乎其微,甚至可以忽略,数据转换的成本比领域模型带来的好处还多,这种情况其实就是在原有的分层架构中...
微服务背景下的架构方案,领域驱动设计与模型驱动开发
本文采用 DDD(领域驱动设计)作为微服务设计指导思想,通过事件风暴建立领域模型,合理划分领域逻辑和物理边界,建立领域对象及服务矩阵和服务架构图,定义符合 DDD 分层架构思想的代码结构模型,保证业务模型与...
下面我从领域、问题域、领域模型、设计、驱动这几个词语的含义和联系的角度去阐述DDD是如何融入到我们平时的软件开发初期阶段的。要理解什么是领域驱动设计,首先要理解什么是领域,什么是设计,还有驱动是什么意思...
DDD领域驱动设计浮夸,Eric Evans开了个坏头 领域驱动设计伪创新 之 聚合根 哪些中文资料上有领域模型案例 领域驱动设计割裂历史,哪里有详细一些的真实历史 软件开发废话赏析:事件风暴 领域驱动设计伪创新:为...
DDD打破了这种隔阂,提出了领域模型概念,统一了分析和设计编程,使得软件能够更灵活快速跟随需求变化。见下面DDD与传统CRUD或过程脚本或者面向数据表等在开发效率上比较
领域模型是什么?一句话:“经济基础决定上层建筑”中的“经济基础”,是帮助理解复杂业务领域问题的基石。有人说:“领域模型是一个商业概念,同行业的企业,一定有内在的共性,是帮助系统分析人员认识现实业务的...
采用spring cloud基本组件以及spring boot组件,对常见组件进行封装成业务开发组件,使用DDD领域驱动模型架构,构建分布式脚手架,减少不必要的环境的搭建,开箱即用,已有组件有授权登录,用户管理,网关,监控组件...