架构师之路 - 业务领域建模
领域模型的概念及作用
领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。概念比较深奥,其实说白了就是我们把基于对业务的理解画成一个类图,并画出这些类之间的关系(面向对象)。
领域模型可以整理业务中的概念以及关系,帮助团队中的成员对业务的理解保持一致,往后可以指导数据库设计、系统功能设计、指导开发。在整个系统建设周期能起到 上接需求,下承开发 的作用。
那既然领域模型如此重要,我们是不是要在类图中尽可能的展示对象的属性和方法,以便更好的指导后续的开发设计。
恰恰相反,我们在建模的时候不要将注意力集中在属性或行为上,应该摆脱这些细枝末节,抓住领域对象定义的最基本特征,只需要体现对象模型的重要概念。如果细节过多很容易产生 ”只见树木,不见森林“ 的现象。
下面我们看一个简化后的报销业务的领域模型,加深一下印象。
完成一个领域模型建模,主要需要做两件事:
-
定义类的关键属性和关键行为;
-
定义类与类之间的关联关系。
定义类的属性和行为
定义类的属性和行为比较简单,用设计工具拖一个class即可,这里只需要注意一下属性和行为的访问权限。
- 表示private # 表示protected ~ 表示default,也就是包权限 + 表示public
定义类与类之间的交互关系
在UML类图中,定义了六种类之间的关系,他们分别是:泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。关系比较多,而且有些还比较相近,比如聚合和组合,接下来我们逐渐讲解:
泛化(Generalization)
介绍:
泛化(Generalization)表示类与类之间的继承关系,接口与接口之间的继承关系。
图例:
使用 空心三角形+实线 表示。
代码实现:
public class A { } public class B extends A { }
实现(Realization)
介绍:
实现(Realization)表示一个class类实现interface接口(可以是多个)的功能。
图例:
使用 空心三角形+虚线 表示。
代码实现:
public interface A { } public class B implements A { }
聚合(Aggregation)
介绍:
聚合(Aggregation)表示一种弱的 ‘拥有’ 关系,即has-a的关系,体现的是A对象可以包含B对象,B类生命周期可以不依赖A类对象的生命周期, 也就是说可以单独销毁A类对象而不影响B类对象,比如课程与学生之间的关系。
图例:
使用 空心的菱形+实线箭头 表示。
代码实现:
public class A { private B b; public A(B b){ this.b = b; } }
组合(Composition)
介绍:
组合(Composition)表示一种强的 ‘拥有’ 关系,即contains-a的关系,体现的是A对象包含B对象,B类生命周期依赖A类对象的生命周期,B类对象不可单独存在,比如鸟与翅膀之间的关系。
图例:
使用 实心的菱形+实线箭头 表示,还可以使用连线两端的数字表示某一端有几个实例。
代码实现:
public class A { private B b; public A () { this.b = new B(); } }
关联(Association)
介绍:
关联(Association)是一种非常弱的关系,包含聚合、组合两种关系。对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。具体到代码层面,如果B类是A类的成员变量,那么B类和A类就是关联关系。
图例:
使用实线箭头表示。
代码实现:
public class A { private B b; public A(B b){ this.b = b; } }
或者
public class A { private B b; public A () { this.b = new B(); } }
依赖(Dependency)
介绍:
依赖(Dependency) 是比关联关系更加弱的关系,包含关联关系。不管是B类对象是A类对象的成员变量,还是A类方法使用B类对象作为参数或者返回值、局部变量,只要B类对象和A类对象有任何使用关系,我们都称他们有依赖关系。
图例:
使用 虚线箭头 表示。
代码实现:
public class A { private B b; public A(B b){ this.b = b; } }
或者
public class A { private B b; public A () { this.b = new B(); } }
或者
public class A { public void func(B b) ... } }
模型简化
严格的UML类图之间的关系拆分的太细,专业要求很高,大大增加了学习成本,而且对于业务沟通,指导后续数据库设计,编程开发没有太大意义。
所以在实际业务建模过程中,我们并不需要严格按照UML类图交互关系来描述业务实体之间的关系,比如我们可以将聚合、组合、关联统统使用关联关系表示,使用实线连接两个实体,并在两侧标记出实例个数即可。
小结
领域模型最终呈现后的结果很简单,但是过程却很复杂。需要架构师基于自身的业务知识和类似产品的参考,再结合客户、业务专家、领域专家的咨询和指导,需要经过不断推倒、修改优化才能完成。
对于刚开始接触领域模型的绘制时经常会出现下面两种典型错误:
-
将待开发系统也放在领域模型里面 待开发系统要不要出现在领域模型中取决于你的业务离开待开发的系统能不能玩的转。举个例子:如果开发的是共享单车的信息系统,共享单车离开信息系统肯定玩不转,所以这时候信息系统需要出现在领域模型。
-
概念划分不清,关系没有画到位 比如属性画成了类,继承关系搞错
以上,希望对你有所帮助!
本文分享自微信公众号 - JAVA日知录(javadaily)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
大数加减乘除,一文搞定!
原创公众号:bigsai 原创不易,如果有收获请不要吝啬你的一键三连! 前言 大家好,我是bigsai!最近,大数加减频频登上笔试的舞台,小伙伴们在群里也分享自己遇到面试官碰到大数运算的题目,想着这么重要而简单的知识点我还没写过,那得好好和大家一起总结一下。 各位有过分类刷题的小伙伴,可能看到很多人分类 字符串、贪心、动态规划、bfs、dfs、大数、数论等,初听大数,你可能会差异:大数是个啥?听起来怪高大上的。 大数,其实就是很大很大数字(可能远超32、64位,基础类型无法表示)的加减法,在Java中我们可以使用一个大数类(BigInteger等)很容易解决大数的各种运算,但如果遇到面试官他肯定会让你手写的。 这个数字一般用字符串、链表等形式表示、返回,大数运算的核心就是:模拟,模拟我们日常用纸笔算数字的加减乘除流程,然后再根据计算机、编程语言等特性适当存储计算即可,不过,大数除法运算稍微特殊一点,和我们直接模拟的思维方式稍有不同。 大数加法 大数加法是最简单的,简单模拟即可。首先,我们想一下两个数加法的流程:从右向左计算求和、进位,一直到最后。 在编程语言中同样也是模拟从右向左逐位相...
- 下一篇
JFinal-layui-pro v2.4 稳定版发布,提升极速开发体验
JFinal-layui-pro专业版 JFinal-layui 极速开发企业应用管理系统,是以 JFinal+layui 为核心的企业应用项目架构,利用 JFinal 的特性与 layui 完美结合,达到快速启动项目的目的。让开发更简单高效,即使你不会后端jfinal,也不会前端layui,也能轻松掌握使用。 该项目的核心功能有:登录、功能管理、角色管理(包含了权限管理)、用户管理、部门管理、系统日志、业务字典,报表管理、代码生成器、通用的附件上传、下载、导入、导出,echart图表统计,缓存,druid的sql监控,基本满足企业应用管理系统的需求,简化了前段代码,后台公用接口都封装完善,你只需要开发业务功能即可。从后端架构到前端开发,从开发到部署,这真正的展现了jfinal极速开发的魅力。 JFinal-layui-pro v2.4稳定版,优化完善了很多实用的功能,如菜单功能的灵活配置、附件上传按钮组件的优化、封装组织架构的组件、代码器兼容oracle版本等等,让开发效率更高,体验更佳。 JFinal-layui-pro下载地址:https://gitee.com/QinHa...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能