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

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

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

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


详细设计-动态模型设计

 

下一个问题就是要创建对象,很多人认为不需要,理由如下:第一,之前提到过其逻辑、对象是不重用的,如果是原来的(类似大富豪游戏),其所有的对象都在内存中,创建完成之后,下次使用时能重用其之前的对象,创建完成是有意义的。

但是在此结构处是一次请求完成后全部对象都不能再使用了,下次请求发送过来全部都是新的,需要从数据库中全部找出来。创建出对象的意义是用完就不再使用了。

而且,对于此业务来说,不用的东西有不同的要求,比如要去改查一个用户,改查一个权限,可能会需要 User 属性。

但对于当前要做的任务,一个用户的权限至是什么,所有的 User 属性都没有意义,有意义的是关系 Role 和 Privilege 权限在第几位上。

其实有意义的是关系和 Privilege 对象的一部分属性。意味着如果要创建对象的话,要创建一个空的 User 对象,关键是 User  对象要知道有多少角色,角色对象早知道有多少权限,权限要知道每一个权限的具体位置,有这些东西足以得到最后需要的东西(权限制),换一种思路,能不能不创建这些对象,创建对象不浪费,不需要放在内存中,又不要重用,最后需要的是权限制,可以把此问题变成一个算权限的问题,就是Privilege对象要知道权限是多少, Role 对象早知道权限至是多少,User 对象的权限制是多少,传统的角度上来说,本来是需要把对象模型构造出来,然后在每一个对象上做一个算权限制方法,然后去完成操作过程,当然也可以算出 Privilege 对象的权限制,再通过箭头算出 Role 的权限制,即全部是倒程来完成权限制的计算,只算权限制,而不建立对象模型,因为对象模型没用,只做最后的结果。

只算权限制来得到最后需要的权限制,接着用一个动态模型来展示权限制的算法:入口是 User Dao,它是不需要写名字的,但是后面的需要写名字,它是一个  UserDao  的对象,在上面写一个方法,方法叫 gapPB,传进去的是一个 User 的 id,登入上来之后,用户名,口令,焦点证券就会得到用户对应的id,不是因为用

户名得到的

接下来使用此id去询问User Dao的权限制是多少,返回的是一个用户的权限制,用户权限制不需要创建User对象,首先需要去掉 Usernodmap,就知道User有多少room,让room的对象告诉这些room的权限制是什么,若得到了这些Role的权限制,就把其并起来即是得到的权限制,因此在User Dao中所做的代码只是说每一个Role有多少Role,其Role的权限制是多少,然后将其并起来就完成了。

要去掉 urm UserRoleMapper,之前提到原则上使用自动生成的方式来操作此Mapper,但是实际操作中会发现对于此Mapper来说,自动生成生成了四个函数,增删改和差,但其实对于 UserRoleMapper 来说,改是没有意义的,它其实只有增开或删除一个角色,不会做改的操作,其查询是非常特定的,自动生成自己生成的查询是所有字段都会查询的,但是在 UserRoleMapper 中数据表拿出来看一下,如下,在其中有意义的字段是 Role id和User id,其他的都没有查询的意义,自动生成会给所有的字段可以查询的条件去做查询的,即不会用主键查询,也不会用角色和用户查询,只会用 Role 和 User 查询,因此对于如此的 Mapper 就会感觉到不熟悉,对于 Mapper来说,原则上会自动生成,但是对于如此的 Mapper 来说会少写两个方法,根据其User id 来查询角色,另一个是根据角色来查询 User id,但是根据角色来查询  User id 早知道 API 中有多少用户,这个决定另一个方法是否要写,不必要两个方法都写,先写一个方法,此上是一个手写的方法,没有把其中的新增和删除保留,修改的方法去掉,没有必要,查询的方法也去掉,没必要。在里面手写一个查询的方法,即 getRoleUserid,得到的是一个 Role id 的列表,即正常查询数

据的事物,不需要去返回一个对象,做法就是要针对里面每一个 Role id

把其 id 拿出来去查询它的对象的 Role 的权限制是什么,其中间还有一段代码是做循环 look 循环,要从 Role id 中到每一个 rid,跳一步到Role 的 Mapper 中去得到rbits,即一个角色的全限制。ger RBitsrid,此 rid 是 rids  的一个局部,里面有其每一个元素,如此就能得到每一个Role 的bits,接着把所有的 bits 并起来就是返回的 RoleDao  同样也不需要把Role对象构造出来,它不使用RoleMapper,而且使用 rpm,rmp 同样需要把其修改删除掉,查询使用自己写的方法(Role Privilege),同样去调用其 getPrivilegeBrole   id(rid), rid 即上述的 rid,得过来之后会得到 pids(集合),即权限中所有的 pid,同样类似的方式去调用其pDao,因其是一个集合,所以是Role,调用去 pdao 去得到其  pbits=getbitsPBByid(pid),同样把所有pbits合起来就会得到要返回的rbits,对于rdao来说,其调用的是 pmMapper,得到 bit_index字段,用其已经生成好的,得到 pivBo=getobjectByid(pid),在 po 对象中,可以写一个业务方法,根据 bit_index 去产生其权限位是多少,此方法可以写在 Prive  对象中,因为在数据库中存储的是它的位置,需要得到一个

bitMappwer 字符串。

因此最后调用 Privilegepo 对象去得到pbit,将 pbit 合起来就是最后的 pbits(注意此处不能使用get,因为po对象对get是有敏感的)此上是计算全限制的整个过程。

最后计算完成后,将其放入rids的缓存中,下次用户在调权限时,就去rids缓存中看其对应的位置是否有权限,若有权限,则可以操作,反之不可以。如果在rids中找不到该对象,则可以调用另一个API(计算全限制),将其再算一遍放入缓存中。

因此两个API都会进行同样的操作,这两个同样的动作在 UserDao 的代码中,意味着 UserDao代码中前面要加一个判断,判断当前的缓存中是否有此bits,若有直接拿

出来,若没有则去查询,查询到后放入缓存中,这是针对单个用户来说的。

如果用户有代理关系则在前面再加一段,观察其代理关系是什么然后代理关系再去调用单个用户的方法,因此真正是前面再加一个去查询它的代理对象和它自己的bits,然后把两个 bits 合起来的方法才是在权限中调用的方法,在如上提到的方法中

前面要加字段去判断rids中间是否有缓存。

若有缓存直接拿到bits,没有则按以上操作去计算,计算完成后再参照流程运行。

相关文章
|
7月前
|
芯片 Python
前道设计
前道设计
49 3
|
数据可视化 数据处理
结构化分析与设计
一、结构化分析与设计 结构化分析与设计(Structured Analysis and Design,简称SAD)是一种软件开发方法论,旨在通过分析和设计来构建高质量的软件系统。 结构化分析与设计的主要特点包括以下几点: 1. 结构化分析:结构化分析是通过对系统需求进行分析,将系统分解为若干个功能模块,并定义它们之间的关系和交互。在结构化分析中,常用的工具和技术包括数据流图(Data Flow Diagram,简称DFD)、数据字典(Data Dictionary)和实体关系图(Entity-Relationship Diagram,简称ERD)等。 2. 结构化设计:结构化设计是在结构化分析
685 2
|
XML 存储 安全
深入理解HttpSecurity的设计
介绍了基于配置文件的使用方式以及实现细节,如下:
107 0
|
7月前
|
存储 SQL 前端开发
分类目录功能模型设计
分类目录功能模型设计
调查表设计
调查表设计
90 0
|
算法 BI
贪心策略设计并解决会场安排问题
贪心策略设计并解决会场安排问题
333 3
贪心策略设计并解决会场安排问题
|
NoSQL Java 数据库连接
详细设计-静态模型设计|学习笔记
快速学习详细设计-静态模型设计
155 0
|
缓存 Java 数据库
详细设计-设计讨论|学习笔记
快速学习详细设计-设计讨论
117 0
|
安全 NoSQL JavaScript
C/C++为什么要专门设计个do…while?
最初do ... while的出现,更多的是作为循环控制流的一种语法糖。因为不论是while 还是 for循环,都是要先判断是否满足进入循环体的条件的。满足条件之后才能进入循环去执行循环体内的操作。
190 0
C/C++为什么要专门设计个do…while?
|
存储 消息中间件 算法
服务设计要解决的问题
 前几天和同事聊天,同事说:   “业务的服务(相对于我们基础架构这边的底层技术)在技术上就需要解决三个问题:分布式、通信和存储。”   我回忆之前做业务的时光,觉得确实,再加上一个“服务治理”就差不多了。想想“服务设计要解决的问题”这个话题可以把之前静儿写的很多文章做一个归纳概括。今天做一个总结。
服务设计要解决的问题