UML类图绘制实例

UML类图绘制实例UML 类图绘制实例下面将使用如属官的借阅管理系统做一个图书馆管理系统的 UML 类图 参考自 LibraryDomai 最终的绘制结果大致如下 前期建模对于图书馆的借阅系统的建模 首先我们把所有需要定义的基础类定义出来 分别是 Book 书籍 Library 图书馆 Patron 顾客 Librarian 图书管理员 四个基础的对象 我们尝试将四个基础类进行关系连接 最后的到的关系图如下 注 就算没有图书 图书馆也不会消失 因此使用空心的关联关系 外链图片转存失败 源站可能

目录

UML类图绘制实例

下面将使用如属官的借阅管理系统做一个图书馆管理系统的UML类图。参考自*Library Domain Model*

最终的绘制结果大致如下:

UML class diagram example of the Library Domain Model.

前期建模

对于图书馆的借阅系统的建模,首先我们把所有需要定义的基础类定义出来。分别是Book(书籍)、Library(图书馆)、Patron(顾客)、Librarian(图书管理员)四个基础的对象。

Library Domain Model-1

我们尝试将四个基础类进行关系连接,最后的到的关系图如下(注,就算没有图书,图书馆也不会消失,因此使用空心的关联关系:

Library Domain Model-2

业务扩展

增加用户账号管理

由于客户借还书籍过程中,图书馆里系统的后台会希望能够查看该顾客的曾借用书籍,已借阅待还书籍,以及当前客户是否有权限进行新书的借阅。

因此我们需要在图书馆管理系统中,引入Account(账户系统)作为代理,用于方便关联借阅的顾客和馆中的书籍。

Library Domain Model-3

该UML中,图书馆持有多个账号,这个不难理解;每个账号代理以前每一个借书者去依赖书,也不难理解;账号有指向Partron的关联关系我们也不难理解,毕竟账户作为代理方,肯定需要有被代理的人的信息;但是可能存在的困惑点在于Account和Patron之间的聚合关系,这里我理解是因为在本项目设计中,账号被设计成了可以回收利用的号码,因此如果该账号闲置的时候,是可以不关联任何用户的,直到账号被下一次利用重新分发给新人。

增加书籍借阅信息

管理好了借书的人,我们的图书馆管理系统还需要增加书籍管理系统,用来标记每本书籍自身的状态,比如该书籍的条码、RFID中的信息、是否允许借出图书馆、图书的类别、图书的借出时间、图书的借阅周期(时长)、图书的应归还时期等等信息。这些都是图书馆自身作图书管理所需要信息而非书籍本身的信息。

因此我们需要在原始图书的基础之上扩展一个图书馆的书目实体Book Item,里面除了书籍自身的信息之外,还包含了该书管理过程中的信息。

更新之后的UML如下:

Library Domain Model-4

增加检索和管理功能

随着图书馆书籍越来越多,图书馆管理员需要对这些书籍进行分类有序放置、对特定的书目进行查找,顾客需要根据条件检索自己需要的书目。因此我们需要继续扩展我们的Book Item类,给其更多的信息便于分类:比如定义其书籍语言、书籍名称、总页数、书目类别等等信息。

此外我们扩展了原始书籍的作者信息,虽然作者通常是在书籍分类时才会使用,但是其本身作为书籍的通识信息,因此在类设计时,将其关联Book而非Book Item。

同时我们需要对图书馆内所有的图书都进行完整的归档管理,所以需要新增一个Catalog类来统一管理。

Library Domain Model-5

这里,因为我们现在已经完成了Book Item的属性扩展,同时建立了Catalog用于专门的图书管理机制,Catalog本身虽然不受是否有书的影响,但是图书馆的管理和检索的规则,是一定建立在我们的Catalog之上的,因此这里使用组合关系。

由于赋予了顾客检索的功能,也赋予了图书馆管理员检索和管理图书的功能。这里我们不难发现两种不同的角色都有一个重复的操作——查找search。同时因为这个Search其实仅仅只和图书馆的目录Catalog相关,无论谁来这个图书馆,他们其实只关心能不能找到自己需要的书,至于怎么从Catalog中找到这本书,以及Catalog是怎么维护所有数目的,对于查找的人来说其实并不需要关心。

因此外部的调用方(比如Patron、Librarian)其实只需要调用这个系统提供的API(也即接口)即可,这个API是一个大家对齐过的统一的规范,比如search就是查找本座图书馆有没有某本书,manage就是管理这本书。外部只需要直到调用这个api可以达到这个目的,而至于怎么达到这个目的则由图书馆的Catalog自行决定和具体实现。

因此最终的类图如下:

Library Domain Model-6

结语

至此一个比较清晰的图书馆的UML类图已经绘制完成。这次在准备继续阅读Spring源码过程中,发现自己不能老是单纯只看实现,而应该从中吸取架构设计经验的时候,发现自己在设计模式层面,知其然而不知其所以然,遂这里先把自己的底子打好,然后再继续我的源码阅读之路。

抬头仰望星空而不是滞于眼前三尺之地,才会知道自己有多渺小~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213346.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:02
下一篇 2026年3月18日 下午6:03


相关推荐

  • 动态库学习[通俗易懂]

    动态库学习[通俗易懂]总结一:动态库前言 我们知道程序编译链接经常使用动态,同时我们可能还知道,动态库时程序运行时加载的。但是动态库到底有什么作用,如何生成、如何加载等,我们却很少关注。接下来,我给大家做一个简单的介绍。1.1动态库和静态库的区别静态库特点(linux):命名上是以*.o结尾静态库在链接阶段直接就加入到可执行的文件中了,在执行过程中无需该静态库相对于动态库生成的文件,使用静态库生…

    2022年9月30日
    5
  • python 平均值/MAX/MIN值 计算从入门到精通「建议收藏」

    python 平均值/MAX/MIN值 计算从入门到精通「建议收藏」##入门级计算####1、算数平均值#样本:S=[s1,s2,s3,…,sn]#算术平均值:m=(s1+s2+s3+…+sn)/nNumpy中的写法m=

    2022年7月6日
    25
  • 8个免费查找文献的学术网站

    今天为大家推荐8个免费查找文献的学术网站,希望能帮到大家。文章来源公众号智慧科研。 1.LibraryGenesis LibraryGenesis号称是帮助全人类知识无版权传播的计划。网站上论文很多,下载方便,几乎每天都在更新。网址:http://gen.lib.rus.ec 2.BookSC BookSC网站截止到今天,已有256万+书籍以…

    2022年4月5日
    127
  • Activiti教程(五)activiti5初始化表和讲解表

    Activiti教程(五)activiti5初始化表和讲解表声明:表详细数据转载自 https://blog.csdn.net/hj7jay/article/details/51302829该博主对activiti数据模型做了很深的讲解一.框架结构二.初始化activit5框架的表执行测试类里的createTables方法packagecom.lpinfo.activiti.test;importorg.activiti.e…

    2022年7月21日
    19
  • Method org.postgresql.jdbc4.Jdbc4Statement.setQueryTimeout(int) is not yet implemented错误解决

    Method org.postgresql.jdbc4.Jdbc4Statement.setQueryTimeout(int) is not yet implemented错误解决17:25:17:166 [Druid-ConnectionPool-Create-1566729816] ERROR log=c.a.d.p.DruidDataSource,traceId=,userId=,msg=create connection SQLException, url: jdbc:postgresql://…:5432/…, errorCode 0, state 0A0…

    2022年6月24日
    32
  • 三分钟教你如何用Github找开源项目–值得一看!

    三分钟教你如何用Github找开源项目–值得一看!Git 读音为 g t 是一个开源的分布式版本控制系统 可以有效 高速地处理从很小到非常大的项目版本管理 GitHub 是一个面向开源及私有软件项目的托管平台 因为只支持 git 作为唯一的版本库格式进行托管 故名 GitHub 按照项目名 仓库名搜索 大小写不敏感 in namexxx 按照 README 搜索 大小写不敏感 in readmexxx 按照 description

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号