详细设计-静态模型设计|学习笔记

简介: 快速学习详细设计-静态模型设计

开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术详细设计-静态模型设计学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/80/detail/15937


详细设计-静态模型设计


内容介绍:

一、分层结构及其主要职责

二、 dao 层

三、创建对象的步骤


一、分层结构及其主要职责

首先,回顾复习分层结构,后面做三层, service 层、 dao 层和 mapper 层。

大家首先要明确这三层的职责是什么,即只有明确每一层的职责,才会具体明确每

一层的对象是什么。

mapper 层之前已经讨论过,结果是对象模型的构建应该在 dao 层完成, mapper 层只应该做单表的操作,如此, mapper 层就变成了增删改查。所以 mapper 层的主要讨论结果是主要、自动生成。增删改查的代码其实没有太大的意义,除非有特殊的要求大家使用自动生成的代码来完成单表的增删改查。

不管使用何种工具,这一部分的主要思想是用代码生成。 dao 层主要是把对象模型构建出来,即在 dao 层中将模型构建在内存中,在模型上计算用户的权限值;所以用户的权限有多少首先要看它有多少角色,角色有多少权限,把它们累积起来才是用户有多少权限。如果说按照标准的做法,即构建出对象模型;其实并没有将对象模型构建完成,但是仍然用到了对象模型的思想和概念。

在例子中, service 没有做什么,因为把 dao 层的模型放出以后 service 层的作用是在模型上计算权限值,之后将权限值放到 Redis 中。这是经典做法的结构, dao 层负责对象, service 层负责在对象中做业务的驱动、计算,得到结构,返回给上一层的控制系统。大家的设计可以看到和标准做法略微有些差异,虽然在做之前明确每一层的职责,但是在做的过程中间又会有一些小的背离,而大的方向是确定的。

如果说各自的系统模块中,其实可以看到在 API 上已经给大家标出,应该完成多个服务,即每一块是一个独立的微服务。大家会认为在做任何一个功能时,单个服务是不足以完成相应功能的,比如订单,一定会用到商品,而商品是在另外的一个服务中,那么商品的服务是按照分工的 service 层调用,即在 dao 层中只负责订单的对象模型的构建;但是会用到 service 层商品的对象模型,即需要用自己的 service 层调用别人的ctrl 层(不是 service 层);

一般而言,是在 service 层调用,不会在 dao 层调用的; dao 层只是负责自己模块中对象模型的构建。对于这个例子来讲,因为权限系统是最基础、最基本的模块,不会调用其他任何得模块,只会被其他的模块调用。但是对于大家而言是有问题的,因为你们需要去相互调用模块。列出 ER 图,知道 mapper 的表是自动生成的,即不管使用何种工具,可以看到三个对象、四种关系,包括 login ;一共是8张表,就会生成8个 mapper ;之后8个 mapper 分别对对应的表进行增删改查的操作。因为大家都对增删改理解;而查,是根据工具不同,比如 best generate ,它是用 example 的对象,因为可以封装非常复杂的场景条件与获得的,去查找该对象。

 

二、 dao 层

对于 dao 层的包装而言,其实没有必要每一个表做一个 dao 层对象; dao 层对象封装的主要想法是针对实体对象做 dao 而不是针对关系对象做 dao 。

有8个 mapper ,只有4个 dao ,因为没有写 login 的 dao ,所以就只剩3个 dao ,所以就只有 UserDao 、 RoleDao 以及 PrivDao 。每一个 dao 层中间要有自己的 mapper ,关于 user 表的 mapper 肯定是在 UserDao 中访问的,叫做 um ;关于用户和角色类表的 mapper ,也是在 UserDao 中访问的,是用户和角色的关系,即一个多对多的关系; user 中有 RdeDao 、 RoleMapper 和 RolePrivilegoMapper 。在三个分层中设计的对象是如下图所示的结构。

但是,目前还没有设计 service 层的对象,因为现在的主要目的是为了在数据库中,将对象模型捞出。所以,如果是自动生成,7张表就会有7个对应的 mapper ,每一个 mapper 对应的都是单张表的增删改查。这里使用 dao 层的设计, dao 层的目的就是为了把对象模型构建出来,所以,大家可以看到 dao 层的作用就是使用 grasp 中创建者的方法,让 dao 层去创建对象,这里的创建对象并不是指传统的面向对象设计的中随便取出一个对象,而是利用 MyBatis 的框架,从数据库查找出一个对象,即不是创建一个对象,而是查找出一个对象,让其从数据库中的一条记录变为在内存中的一个对象。

而 dao 层的作用不仅仅是把对象创建出来,而且把对象的关联也全部进行创建。也就是大家可以看到的每一个 dao 层负责的 mapper 是不一样的。

 

三、创建对象的步骤

比如整个权限系统不做一个 dao 层对象,而做成三个 dao 层对象,是希望把创建的过程进行分离,分离的原则就是创建者模式。最小的是 PrivDao ,因为它的整个对象模式是在最尾巴上做的,那么它只是负责通过 PrivilegeMapper 去创建 Privilege 对象。其次, RoleDao 要创建 Role 的对象,还需要创建 Role 中所有的 Privilege 的对象,但是它不是自己去创建的,它只是调用了 PrivDao 去创建 Privilege 对象。至于要创建何种的 Privilege 对象靠的是 RolePrivilegeMapper 中查出的该 Role 中有多少的  Privilege ,之后让 PrivDao 去创建 PrivDao 对象,然后将其关联到 Role 上。

同理, user 也是一样的, user 使用 UserMapper 创建了对象,之后在 UserRoleMapper 中查看 user 中有多少 Role ,之后让  RoleDao 去创建 Role 的对象,然后将它们关联起来。可以看到这样的设计,虽然没有 new 函数,但是它的思想是 grasp 原则中的创建者思想,把从 MyBatis 中查对象的动作认为是创建对象,然后按照创建这的思想给它分到了多个 dao 区。所以,面向对象的设计思想一定要结合具体的技术框架去使用;比如,在课本上看到的面向对象创建者的东西是 new ,在 new Role 时,由 Role 去负责 new Privilege ,这是书本上的东西。

但是,放在 MyBatis 中它就不是 new ,而是用 MyBatis 去查阅对象;在查的过程中并不是用对象去查对象,而是靠 dao 的对象去调用 mapper 的对象。因为 dao 的对象就是为了构建对象,所以,认为 dao 的对象的作用就是构建对象;使用 grasp 中的创建者模式把 dao 分为三个,并将它们相互关联。课本上,大富豪的例子是没有意义的,因为现在基本上不会做一个纯的在内存中间存在的对象的系统;数据量非常巨大的东西一定是在数据库中或者别的环境中。所以像在课本中间,纯在内存中搞出一大堆对象去使用的情况基本上是没有的,但是,这些思想都是可以使用的。

比如,在特定的 MyBatis 技术架构当中,使用了 grasp 中的创建者思想,把创建的内存中的对象以及之间的关联分到三个 dao 中。

相关文章
|
XML JSON 算法
【软件设计师备考 专题 】编写内部设计文档:构件划分图和接口
【软件设计师备考 专题 】编写内部设计文档:构件划分图和接口
56 0
|
7月前
|
存储 缓存 监控
《优化接口设计的思路》系列:第二篇—接口用户上下文的设计与实现
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。
53 0
|
2月前
|
传感器 运维
【软件设计师备考 专题 】编写外部设计文档:系统配置图和关系图
【软件设计师备考 专题 】编写外部设计文档:系统配置图和关系图
52 1
|
数据可视化
【设计篇】35 # 如何让可视化设计更加清晰?
【设计篇】35 # 如何让可视化设计更加清晰?
56 0
【设计篇】35 # 如何让可视化设计更加清晰?
|
数据可视化
【设计篇】36 # 如何理解可视化设计原则?
【设计篇】36 # 如何理解可视化设计原则?
196 0
【设计篇】36 # 如何理解可视化设计原则?
|
存储 缓存 算法
详细设计-动态模型设计|学习笔记
快速学习详细设计-动态模型设计
90 0
|
缓存 Java 数据库
详细设计-设计讨论|学习笔记
快速学习详细设计-设计讨论
91 0
类设计:设计卖车的4S店
class Car(object): # 定义车的方法 def move(self): print('---车在移动---') def stop(self): print('---停车---') # 定义一个销售车的店类 class Car...
738 0