图书馆信息系统UML实例
图书馆信息系统UML实例

2019/2/24
国防科技大学计算机学院
14
2. 领域分析-类图的建立
有一点要强调的是在本阶段域类还是处于草图状 态,定义的操作和属性不是最后的版本,只是在 现阶段看来这些操作和属性是比较合适的,一些 操作是在序列图的草图中而不是在用例中定义的。
2019/2/24
国防科技大学计算机学院
15
Item(书目)类的定义
2019/2/24 国防科技大学计算机学院 17
Item与Title的关系
Item -ID : int +find title() +find id() +find reservation() -create() -destroy()
Title
Copy of
-Name : string -Num : int +find() #create() #destroy()
2019/2/24
国防科技大学计算机学院
28
包或子系统的设计
本例中的包或子系统或层有如下几个: 用户接口包(User Interface Package),通 过用户接口类用户可以浏览系统中的数据,输入 新的数据这些用户接口类都是基于Java的AWT 包。Java的AWT包是Java中用来写用户接口 应用的标准库。该包同包含存储数据的类的业务 包协作来完成任务用户接口包调用业务包中的操 作来检索和插入数据。
Loan -data : int = 当前日期 #create() #destroy()
Book Title -Days : int = 30 #create() #destroy()
Magazine Title -Days : int = 30 #create() #destroy()
图书馆管理系统uml样本

图书馆管理系统一、用例图本系统确定的参与者有两类: 读者和图书管理员。
1.图书管理员所包含的用例(1)登录系统: 管理员能够经过登录该系统进行各项功能的操作。
(2)书籍管理: 包括对书籍的增、删、改等。
(3)书籍借阅管理: 包括借书、还书、预订、书籍逾期处理和书籍丢失处理等等。
(4)读者管理: 包含对读者的增删改等操作。
(5)自动借书机的管理。
2.读者所包含的用例(1)登录系统(2)借书: 进行借书业务。
(3)还书: 读者具有的还书业务。
(4)查询: 包含对个人信息和书籍信息的查询业务(5)预订: 读者对书籍的预订业务。
(6)逾期处理: 就是书籍过期后的缴纳罚金等。
(7)书籍丢失处理: 对书籍丢失后的不同措施进行处理。
(8)自动借书机的使用等。
该图书馆管理系统的用例图如下:二、系统的顺序图顺序图是显示对象之间交互的图, 这些对象是按时间顺序排列的。
该图书馆管理系统主要含有以下几个重要的顺序图: (1)借书顺序图(2)还书顺序图1、借书顺序图2、还书顺序图三、系统的状态图图书馆的书籍状态图如图5所示。
状态图说明:书籍在未变成图书馆在库书籍时, 为新加书籍状态。
书籍处于在库状态时既能够预订也能够外借, 外借后变为借出状态。
处于预订状态时也能够外借, 超出预订时间期限则从预订状态直接转为可用状态。
借阅者在规定的预订时间内也能够考虑取消预订, 取消预订后书籍的状态转为可用。
外借书籍归还后变为可用状态。
四、系统的活动图活动图描述的是某流程中的任务的执行, 活动图描述活动是如何协同工作的, 当一个操作必须完成一系列事情, 而又无法确定以什么样的顺序来完成这些事情时, 活动图能够更清晰地描述这些事情。
下面描述了图书馆系统的借书、还书和预订的活动图。
1.借书活动图管理员首先要扫描读者的借书证, 检验证件是否符合图书馆借书条件, 若该读者的借书数量还未达到最大规定数量, 而且其所借书籍均未属于过期范围, 则符合借书条件。
图书管理系统UML图

案例:图书管理系统一、图书管理系统功能描述图书管理系统能够对图书进行注册登记,也就是将图书的基本信息(如编号、书名、价格、作者等)预先存入数据库中,供以后检索,并且能够对借阅人进行注册登记,包括记录借阅人的姓名、编号、班级、年龄、性别、地址、电话等信息。
同时,图书管理系统提高方便的查询方法。
如以书名、作者、出版社、出版时间等信息进行图书检索,并能反映出图书的借阅情况;以借阅人编号对借阅人信息进行检索;以出版社名称查询出版社联系方式等信息。
图书管理系统提供对书籍进行预订的功能,也提供旧书销毁功能,对于淘汰、损坏、丢失的书名可及时对数据库进行修改。
图书管理系统能够对使用该管理系统的用户进行管理,按照不同的工作职能提供不同的功能授权。
总的来说,图书管理系统主要包含下列功能。
1)读者管理:读者信息的制定、输入、修改、查询,包括种类、性别、借书数量、借书期限、备注等。
2)书籍管理:书籍基本信息制定、输入、修改、查询,包括书籍编号、类别、关键词、备注。
3)借阅管理:包括借书、还书、预订书籍、续借、查询书籍、过期处理和书籍丢失后的处理。
4)系统管理:包括用户权限管理、数据管理和自动借还机的管理。
二、图书管理系统用例图1.确定参与者本系统的参与者包括两个:读者、管理员。
.2.确定用例管理员包括的用例:1)登录系统:管理员可以通过登录该系统进行各项功能的操作。
2)书籍管理:包括对书籍的增删改查操作。
3)书籍借阅管理:包括借书、还书、预订、书籍逾期处理和书籍丢失处理4)读者管理:包括对读者的增删改查操作。
读者包括的用例:1)登录系统。
2)借书。
3)还书。
4)查询:包括对个人信息和书籍信息的查询业务。
5)预订:读者对书籍的预订业务。
6)逾期处理:书籍过期缴纳罚金等。
7)书籍丢失处理:对书籍丢失后的不同措施进行处理。
8)自动借书机的使用。
3.用例图三、图书管理系统用例规约1. 借书用例规约用例名称借书UC01ID 用例用例说明本用例描述读者通过管理员借书的过程。
UML图书管理系统类图 文档

图书借阅系统用例分析1。
用户采用用例图描述的图书借阅系统主要包括三类用户:读者、图书管理员、系统管理员。
其中,读者是多个,图书管理员是几个,系统管理员是一个。
1.1读者描述:读者可以借阅、预约、续借、归还图书,可以对书籍和个人信息进行查询,可以取消预约,可以提出办理图书借阅证的申请。
示例:持有图书借阅证的任何人。
1.2图书管理员描述:图书管理员对图书信息维护,包括图书订购、新书入库、破损修补、旧书下架,另外还对读者信息进行管理,进行借阅登记等.示例:图书管理员1。
3系统管理员描述:系统管理员对系统进行维护,包括读者信息的创建、修改、删除,日志维护,权限维护,后台数据维护,还有系统信息的维护。
示例:系统管理员2.用例通过识别的参与者,对需求进一步分析,将业务需求进行分解,获得每个参与者的使用用例:2.1读者(1)读者办卡:提供为读者办理借书证的功能(2)书籍查询:为读者提供书籍查询功能(3)书籍借阅:提供借阅书籍的功能(4)书籍续借:提供续借书籍的功能(5)书籍预约:提供对某一书籍的预约功能(6)取消预约:提供对预约进行取消的功能(7)书籍归还:提供归还书籍的功能(8)读者信息查询:为读者提供个人信息查询的功能(9)缺书登记:当读者需要的书籍查询书库没有记录时,读者可将此书进行缺书登记2.2图书管理员(1)图书信息维护图书订购:参考各类图书的库存数和借阅率及缺书登记,对书籍进行统一采购新书入库:将新书到货进行编号入库书籍破损修补:当书籍有损坏时进行修补旧书下架:将遗失或淘汰的书籍从书库中清除(2)读者信息管理(3)借阅书籍登记2。
3系统管理员(1)系统维护:维护图书借阅系统的系统结构(2)日志维护:维护系统中各种日志,如借阅记录、书籍记录等(3)权限维护:确定系统各参与者的权限,维护相关权限(4)增删用户:增加或者删除用户及相关信息(5)后台数据维护:维护系统后台数据库中的各种数据3。
用例图3。
1用例说明4 类图在用例分析基础之上,根据需求可建立起系统的静态数据模型,即建立系统类图。
图书管理系统uml_用例图

图书管理系统图书管理系统的用例(1)、确定系统设计的总体信息借阅者:①登记②借书③还书系统管理员:①打开页面②扫描借阅证③查询借阅者信息④扫描图书id⑤提交借阅信息⑥打印小票⑦添加借阅者,并对其账户管理⑧图书信息查询图书管理员:①图书归类②增加图书(2)、确定系统的参与者首先分析系统所涉及的问题领域和系统运行的主要任务:①使用该系统主要功能部分的人是系统管理员,系统管理员主要任务是对整个图书各信息的处理,并扫描图书与借阅者信息,实现借书还书。
②系统管理员需要该系统的支持以完成其工作图书管理系统的参与者:①借阅者②图书管理员③系统管理员(3)、确定系统的用例⒈借阅者借书的用例•选定图书•带到柜台⒉系统管理员借书的用例•扫描借阅这证•显示借阅者信息•扫描图书id•重复上一步•提交借阅信息并打印小票⒊图书管理员进行图书维护的用例•查询图书信息•增加图书•图书归类(5)、摘要形式的用例示例借书:借阅者带着图书来到柜台。
系统管理员使用图书管理系统处理借阅者所选图书信息以及借阅者信息。
系统显示借阅者信息以及图书信息。
系统管理员使用图书管理系统记录每一次操作。
系统连续显示累计总数,并逐行显示细目。
系统更新数据库信息。
借阅者员得到小票,然后携带图书离开。
(6)、详述风格的处理借书用例详述用例是结构化的,他展示了更多细节,并且更为深入。
用例UC1:系统管理员处理借书过程范围:图书管理系统(books Management System)级别:用户图标主要参与者:系统管理员(system Manager)涉众及其关注点:—借阅者:以最优价获得图书。
—系统管理员:准确输入图书及借阅者信息并快速服务。
—图书管理系统:准确的记录借阅过程,满足借阅者需求。
希望有一定的容错性,即使在某些服务器构建不可用时,也能够完成购物。
希望能够自动快捷的更新借阅信息和库存信息。
前置条件:系统管理员必须经过确认和认证。
成功保证(后置条件):存储借阅信息。
图书馆管理系统UML

图书馆管理系统一、用例图该图书馆管理系统的用例图如下:图1:图书馆管理系统的用例图二、系统的顺序图(1)借书顺序图(2)还书顺序图(3)罚款顺序图1、借书顺序图图2:图书馆管理系统借书顺序图顺序图说明:(1)login():登录系统。
(2)checkstu_card():对读者信息进行验证,检查是否符合本图书馆借书条件。
(3)showinformation():显示该读者的基本信息函数。
(4)borrow():读者借书函数。
(5)getreaders():取得读者信息函数。
看该读者是否符合借书条件,若符合,则返回可借信息。
(6)gettitle():取得书目信息。
(7)getreservation():检验书籍是否被预订函数。
(8)getnoreservation():书籍没被预订或取消预订函数。
(9)create(borrower,item):创建书籍外借函数。
2、还书顺序图图3:图书馆管理系统还书顺序图顺序图说明:(1)login():登录系统。
(2)getitem():取得书籍条目信息。
(3)update():对图书馆书籍条目和借阅者信息进行更新条目。
3、罚款顺序图图4:图书馆管理系统的罚款顺序图顺序图说明:管理员扫描图书,图书显示过期天数,罚款金额按过期天数累加三、系统的状态图图5:图书馆的书籍状态图四、系统的活动图1.借书活动图管理员首先要扫描读者的借书证,检验证件是否符合图书馆借书条件,若该读者的借书数量还未达到最大规定数量,并且其所借书籍均未属于过期范围,则符合借书条件。
则再扫描书籍条形码,检查书籍是否是不可借书籍或者已经被预订,若被预订,则取消预订,方可借书。
在这些条件都符合时则更新书籍信息和读者的借阅信息,记录好借书的时间。
图6:图书馆管理系统的借书活动图2、还书活动图图书管理员对书籍进行扫描,若书籍已经过期,则要求读者还请欠款才能还书,读者缴应交罚款后,更新书目信息和读者信息。
UML实例UML案例(完整建模)(图书馆信息系统)

1: add item( ) : Administrator
: Maintenance Window
3: update( )
2: find(String)
: Item
: Title
2. 系统管理员删除书籍的协作图
1: remove item( ) : Administrator
: Maintenance Window
: Item
2. 系统管理员添加借阅者帐户的时序图
: Administrator
: Maintenance Window
1: create borrower( )
: Borrower
2: create(String, String)
3. 系统管理员删除书目的时序图
4. 图书管理员处理书籍借阅的时序图
书籍。 ② 借阅者能够借阅书籍和还书。 ③ 图书管理员能够处理借阅者的借阅和还书
请求。 ④ 系统管理员可以对系统的数据进行维护,
如增加、删除和更新书目,增加、删除和 更新借阅者帐户,增加和删除书籍。
系统功能需求
▪ 系统主要包括以下几个模块: ① 基本数据维护模块 ② 基本业务模块 ③ 数据库管理模块 ④ 信息查询模块
ReturnItem Fram e.j ava Fi ndBorrowerDi al og.j ava
T i tl eInfoWi ndow.j ava
LendItemFrame.java FindTitleDialog.java
BorrowerInfoWindow.java
UpdateT i tl eFram e.j ava
: Borrower
: Reservation Window
图书管理系统UML图

案例:图书管理系统一、图书管理系统功能描述图书管理系统能够对图书进行注册登记,也就是将图书的基本信息(如编号、书名、价格、作者等)预先存入数据库中,供以后检索,并且能够对借阅人进行注册登记,包括记录借阅人的姓名、编号、班级、年龄、性别、地址、电话等信息。
同时,图书管理系统提高方便的查询方法。
如以书名、作者、出版社、出版时间等信息进行图书检索,并能反映出图书的借阅情况;以借阅人编号对借阅人信息进行检索;以出版社名称查询出版社联系方式等信息。
图书管理系统提供对书籍进行预订的功能,也提供旧书销毁功能,对于淘汰、损坏、丢失的书名可及时对数据库进行修改。
图书管理系统能够对使用该管理系统的用户进行管理,按照不同的工作职能提供不同的功能授权。
总的来说,图书管理系统主要包含下列功能。
1)读者管理:读者信息的制定、输入、修改、查询,包括种类、性别、借书数量、借书期限、备注等。
2)书籍管理:书籍基本信息制定、输入、修改、查询,包括书籍编号、类别、关键词、备注。
3)借阅管理:包括借书、还书、预订书籍、续借、查询书籍、过期处理和书籍丢失后的处理。
4)系统管理:包括用户权限管理、数据管理和自动借还机的管理。
二、图书管理系统用例图确定参与者1.本系统的参与者包括两个:读者、管理员。
2.确定用例管理员包括的用例:1)登录系统:管理员可以通过登录该系统进行各项功能的操作。
2)书籍管理:包括对书籍的增删改查操作。
3)书籍借阅管理:包括借书、还书、预订、书籍逾期处理和书籍丢失处理4)读者管理:包括对读者的增删改查操作。
读者包括的用例:1)登录系统。
2)借书。
3)还书。
4)查询:包括对个人信息和书籍信息的查询业务。
5)预订:读者对书籍的预订业务。
6)逾期处理:书籍过期缴纳罚金等。
7)书籍丢失处理:对书籍丢失后的不同措施进行处理。
8)自动借书机的使用。
3.用例图三、图书管理系统用例规约借书用例规约1.用例名称借书UC01ID用例本用例描述读者通过管理员借书的过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
返回总目录目录第11章图书馆信息系统UML实例 (2)11.1 理解需求 (2)11.2 分析 (3)11.3 设计 (6)11.4 实现 (15)11.5 测试和配置 (22)11.6 小结 (23)第11章图书馆信息系统UML实例本章将通过一个实例来说明在一个应用中如何使用UML通过前面的讨论首先在分析模型中用用例和域分析来描述应用然后将分析模型扩展成设计模型描述技术上的解决方案最后用Java语言编程具体实现可以运行的应用有一点需要说明的是本章中讨论的例子并不包括所有的模型和图本章讨论的案例是一个图书馆信息系统主要处理书和杂志的借阅和保存虽然它算不上是一个大的应用但可以对它作许多扩展本章的案例研究的目的主要有三个演示在一个完整的应用中如何使用UML从分析到设计模型到真正的代码和可运行的应用以Rational Rose为例说明用UML建模时使用的工具有兴趣的读者可以根据本章中讨论的方法对模型进行扩展从而达到提高应用UML的水平注意本章给出的仅仅是一个可能的解决方案可能还有许多其它的方案不存在一个适用于所有环境的正确的解决方案如果读者想对初始的模型作些改变尽管去做目的只有一个产生满足需求且工作正常的系统而不是产生在所有细节上都很完美的图当然某些解决方案将被证明比其它的好但是只有各界经验和努力工作才能获得知识11.1 理解需求下面是一份典型的文本需求说明它是图书馆应用程序的第一版的需求说明是为系统的终端用户或客户而写的它是图书馆的支持系统z图书馆将书和杂志借给读者读者和书杂志一样必须在系统中注册z图书馆负责购买图书对于流行的书一般要多买几本如果旧书或杂志过期了或很破烂则可以从图书馆中删除z图书馆管理员是图书馆的雇员负责与客户(借书者)打交道他们的工作要得到系统的支持z借书者可以预订目前借不到的书或杂志一旦预订的书被返还给图书馆或图书馆新购买书到达就立即通知预订者z图书馆可以方便地产生更新和删除系统中与书目借书者借书(loan)和预订的有关信息z系统能够在所有流行的技术环境下运行(UNIX, Windows, OS/2 等等)还应该有一个非常好的图形用户界面(GUI)z系统应该具有很好的可扩展性系统的第一个版本不需处理当读者预订的书到达时通知预订者的消息也不必检查一个书目是否过期有关更高的版本的其它需求可在本章的练习中了解到11.2 分析分析就是描述系统的需求通过定义系统中的关键域类来建立模型分析的根本目的是在开发者和提出需求的人(用户/客户)之间建立一种理解和勾通的机制因此典型情况下分析是开发人员同用户或客户一起来完成的分析不受技术方案或细节的限制在分析阶段开发人员不应该考虑代码或程序的问题它是迈向真正理解需求和所要设计的系统的第一步11.2.1需求分析分析的第一步是定义用例即描述图书馆系统的功能确定系统的功能需求用例分析主要涉及阅读和分析规格说明和系统的潜在用户讨论图书馆中的角色为图书管理员和借书者图书管理员是系统的用户而借书者是客户虽然偶尔图书馆管理员或另一个图书馆也可能是一个借书者借书者的目的不是直接同系统交互借书者的功能由图书管理员来实现图书馆信息系统中的用例如下所示z借出书目(Lend Item)z返回书目(Return Item)z预订(Make Reservation)z删除预订(Remove Reservation)z增加标题(Add Title)z更新或删除标题(Update or Remove Title)z增加书目(Add Item)z删除书目(Remove Item)z增加借书者(Add Borrower)z更新或删除借者书(Update or Remove Borrower)上面所列的用例中没有维护维护是一个使用其它用例的更一般的用例同时还应注意到上述用例中出现的两个概念标题(Title)和书目(Item)因为在一个图书馆中一个流行的标题可能有好几本因此系统必须将标题(可能是书名或书的作者)同其它的书目(代表一个指定标题的物理副本)区分开来从图书馆借的是书目在图书馆拥有一本书的副本(书目)之前加一个标题到系统中是可能的这样做的目的是让借书者可以预订图书馆信息系统的分析可以用UML的用例图来描述如图11-1所示每个用例以文本的方式来描述描述的内容包括用例以及用例与角色交互的更详细的信息文本的内容是通过与用户/客户讨论后确定的用例借出书目的描述如下1如果借书者没有预订a. 标记标题b. 标记可用的该标题下的书目c. 标记借书者d. 图书馆借出标记的书目图11-1图书馆信息系统的用例图2如果借书者已经预订a. 标记借书者b. 标记标题c. 标记可用的该标题下的书目d. 图书馆借出标记的书目e. 增加一条新的借书记录f. 删除预订记录读者可以照此法描述其它的用例在整个系统开发过程中用例描述系统的功能需求在分析阶段利用它们来检查某一域类是否已定义在设计阶段可以用来证实技术方案是否能够处理要求的功能可以在序列图中可视化用例11.2.2 领域分析分析也将系统中的领域和关键类条理化为了进行领域分析需要阅读规格说明和用例了解系统要处理的概念或将用户领域专家组织在一起开一个讨论会设法确定所有必须处理的概念以及概念间的关系图书馆信息系统中的域类主要有借书者(在这里将其取名为BorrowerInformation 以便同用例图中的角色Borrower 区分开)标题书的标题杂志标题书目预订和借书(loan)在类图中将这些域类以及它们之间的关系表示出来如图11-2所示通过版类Business Object来定义域类Business Object是一个用户定义的版类用来表示类的对象是关键域的一部分应该永久地保存在系统中有一点要强调的是在本阶段域类还是处于草图状态定义的操作和属性不是最后的版本只是在现阶段看来这些操作和属性是比较合适的一些操作是在序列图的草图中而不是在用例中定义的(有关情况将在本章后面讨论)某些类用UML状态图来显示类的对象的不同的状态以及改变状态的事件有状态图的类有书目和标题标题类的状态图如图11-3所示为了描述域类的动态行为任何动态UML图都可以使用序列图协作图或活动图因为Rational Rose 4.0不支持活动图对协作图也只提供有限的支持因此我们选用序列图序列图的基础是用例在序列图中说明域类如何协作来操作系统中的用例很自然地当建立这些序列图时将会发现新的操作并将它们加到类中(图11-2中的类图显示了建立的序列图模型)另外操作仅仅是草案同样要用说明来详细描述分析的目的是同用户/客户勾通以对要建立的系统有更好的了解而不是一个详细的设计方案用例借出书目(没有预订)的序列图如图11-4所示当用序列图建模时很显然需要窗口或对话窗作为到角色的接口在图11-4中借出书目的窗口是存在的在分析时意识到需要窗口来标识基本的接口就可以了借出预订和返还书目都需要窗口维护窗口也是必要的此时还没有定义详细的用户接口另外关于用户接口中包含些什么仅仅还是个草案注意无论怎样也有一些过程或方法提倡在本阶段设计或原型化一个详细的用户接口但是在本例中因为应用比较简单所以不采用这些技术详细的用户接口是设计阶段的一部分在分析阶段为了将域类同窗口类分开将窗口类组装成一个GUI包(称为GUI包)将域类组装成业务包(Business Package)此外也给应用程序取一个名字称为通用图书馆应用(Unified Library Application)11.3 设计图11-2 图书馆信息系统的域类结构图11-3 标题类的状态图设计阶段和最后的UML模型是将设计阶段的模型进行扩展和细化主要考虑所有的技术问题和限制设计的目的是产生一个可用的解决方案并且能够比较容易地将方案转换成程序代码在分析阶段定义的类被进一步细化定义新的类来处理技术方面的问题图11-4 用例借出书目的序列图(没有预订的情况)一般将设计分为两个部分z架构设计这是高级设计在架构设计中需用定义包(子系统)包间的相关性和基本的通信机制一个很自然的要求是得到清晰而简单的架构即在架构中相关性要尽可能少双方相关性要尽可能地避免z详细设计本部分将包的内容细化即尽可能详细地描述每一个类使得编程人员根据它们很容易地编码UML中的动态模型被用来显示类的对象在指定的情况下如何动作11.3.1架构设计一个设计良好的架构是系统可扩展和可改变的基础包关心的是某一指定功能域或技术域的处理将应用逻辑(域类)和技术逻辑分开是很关键的从而使得任何一个改变不至于对其它部分有太多的影响在定义架构时需要描述的关键事情是标识和建立包间相关性规则使得包间不存在双方相关性(避免包紧耦合在一起)明确必须的标准库和发现要使用的库今天市场上可买到的库主要涉及某些技术领域如用户接口数据库或通信但期望有更多的与应用有关的库出现本例中的包或子系统或层有如下几个z用户接口包(User Interface Package)通过用户接口类用户可以浏览系统中的数据输入新的数据这些用户接口类都是基于Java的AWT包Java的AWT包是Java中用来写用户接口应用的标准库该包同包含存储数据的类的业务包协作来完成任务用户接口包调用业务包中的操作来检索和插入数据z业务对象包(Business Object Package)业务对象包包含分析模型中的域类如BorrowerInformation, Title, Item, Loan,等等这些类的所有细节都已有明确定义所以类中的操作都已定义好了并支持加入持续性属性业务对象包同数据包协作完成任务因为所有的业务对象类必须从数据包中的持续性类(Persistent class)中继承下来z数据库包(Database Package)数据库包提供服务给业务对象包中的类所以可以永久地保存它们在当前版本中持续性类将它的子类的对象存放在文件系统中的文件z应用包(Utility Package)应用包提供服务给系统中其它种类的包目前包中只有一个类ObjId它被用户接口包业务对象包数据库包用于在系统范围内引用持续性对象这四类包的内部设计如图11-5所示11.3.2 细节设计细节设计的目的是描述用户接口和数据库包中的类扩展和细化业务对象类的描述(在分析阶段已有初步描述)细节设计的方法通常是产生新的类图状态图和动态图(如序列图协作图和活动图)这些图与分析阶段中的图是一样的但是在此处这些图的定义更详细涉及更多的技术细节分析阶段的用例描述被用来验证用例在设计中的处理序列图被用来说明技术上如何在系统中实现每一个用例图11-5 显示应用包及包间相关性的类图1 数据库包应用必须永久保存一些对象因此必须用数据库层来提供这种服务对于一个全新的应用而言最自然的解决方案就是使用商用数据库要么选用一个真正的面向对象的数据库或选用一个传统的关系数据库但要增加对象与表之间的转换层但是因为我们的例子应用的目的是要可移植的并不要求某一供货商的许可证所以我们选择了一个比较简单的解决方案这种方案就是将对象简单地存放在磁盘上的文件中尽管如此存储的细节对应用而言是透明的它只需调用对象上的一些公共操作即可如store(), update(),delete(), find()等等与永久存储有关的实现均由类Persistent 来完成所有需要永久存储的对象的类均需继承Persistent 类Persistent 类是抽象的要求子类具体实现读写操作write()和read()子类也可以有选择地实现在类范围内查找对象的操作这样的实现需要调用Persistent 超类中更多的操作持续性处理中的一个很重要的因素是ObjId 类它的对象被用来引用系统中的任何持续性对象(不管被引用的对象是在磁盘上还是已经在应用的内存中)ObjId(Object Identity)是一种著名的处理应用中对象引用问题的技术通过使用对象标志符将对象ID传给Persistent.getObject()操作就可以从持续性存储器中找到该对象并返回通常情况下这一工作不是直接完成的每一个持续性类中的getObject 操作还要进行类型检测和转换可以方便地将对象标志符作为参数在操作间传递(例如查找一个指定对象的搜索窗口可以将它的搜索结果通过一个对象ID传给另一个窗口)ObjId是系统中的一个通用类系统中的所有包(用户接口业务对象数据库)都要使用它所以将ObjId 放在应用包中(目前情况下它是应用包中的唯一的应用)事实上它与数据库包的关系最密切但是如果将它放在数据库包中就意味着用户接口包与数据库包之间有直接的相关性而这种相关性应该是尽量避免的(用户接口应该只与业务对象包有直接的相关性)还可以对目前的Persistent类的实现作些改进当更新一个对象时只需将对象的当前的记录标记为删除并将对象的新的版本加在文件的结尾不重写老版本的原因是对象可以已经改变了它的长度(如果对象有一个用来存储一对多或多对多关联的不受长度限制的矢量时)另外搜索当前的对象是串行进行的方法是从文件头开始搜索(忽略删除的记录)同样可以对这种搜索方法作些改进方法是重新申请文件中被删除的存储空间以建立一个索引文件来优化对象的搜索Persistent类的接口被定义后改变持续性存储的实现就比较容易了可以将对象存放在关系数据库中或在一个面向对象的数据库中或使用Java 1.1中的持续性对象支持的方式来存储在当前的设计中没有设置不允许这么做的任何限制只需对Persistent类的内部实现作些改变2业务对象包设计阶段的业务对象包是基于分析阶段的相对应的包域类(domain class)保留域类中的类类间的关系和行为只是将类进一步细化包括如何实现类间的关系和行为在这些实现说明中所有业务对象类继承数据库包中的Persistent类实现必须的读写操作将分析阶段的操作细化意味着将一些操作转换成设计模型中的几个操作将一些操作改名这样做是很正常的因为分析阶段得出的是每一个类的能力的草案而设计是系统的详细描述因此设计模型中的所有操作必须有明确的说明和返回值(因为空间的限制在图11-6中没有将它们显示出来)注意设计与分析之间的下列变化z系统的当前版本并不检查一本书是否已按时返回也不处理预订的顺序因此Loan和Reservation类的日期属性还没有实现z对杂志和书的标题的处理是一样的除了最大借出日期但对日期并不处理因而可以认为分析模型中的子类Magazine Title和Book Title是不必要的仅仅Title类中的类型属性可以用来说明标题指的是杂志还是书如果认为在此应用程序的将来版本中需要这些简化可以很容易地删除在设计阶段分析阶段产生的状态图也被细化即描述如何表示状态在工作的系统中如何处理状态Title类的设计状态图如图11-6所示这些状态用一个称为预订(reservation)的矢量来实现该矢量中包含相关的预订对象的对象标志符(参考类图中的Title与Reservation之间的关联)当矢量中没有元素时(也就是说为空)Title对象处于没有预订(Not Reserved)状态当矢量中有一个或多个元素时状态为已预订(Reserved)其它对象可以调用addReservation()和removeReservation()来改变Title对象的状态如图所示将分析阶段的状态图11-3和设计阶段的状态图11-7进行比较可以看出如何将分析阶段的状态图转换成设计阶段的状态图3用户接口包图11-6 设计模型中的业务对象用户接口包处理其它包的顶部它将系统中的服务和信息显示给用户如前所述用户接口包是基于标准的Java AWT(Abstract Window Toolkit)类库该类库是用来写Java应用中的用户接口且能在所有Java 平台上运行在AWT 库中的所有类没有在设计模型中显示出来虽然这些类会在它们自己的包中显示(在Rational Rose 的Java 版中读和显示Java 类结构将其简化了)在AWT类库中提供不同类型的窗口类(如框架(frame)对话框(dialog)等等)和不同类型的接口组件类如表(table)按钮(button)编辑条(edit field)列表箱(list box)等等AWT 类库还负责管理用户产生的事件的处理如图11-7 显示Title 对象实现的设计状态图设计模型中的动态模型被指派给GUI 包因为所有的与用户的交互是通过用户接口来初始化的再者序列图已经被用来显示动态模型虽然序列图中的一些内容已经被转换到协作图中序列图的基础是用例的分析除了用例的实现是在设计模型中详细描述外(包括类中的实际的操作交互分析更多是一种概念)当序列图出现在此处或模型中时不需画出来但是在交互时需要画出来因而最终的设计是慢慢产生的而且序列图中的其它的修改是由实现阶段发现有问题时引起的设计模型中的序列图是这些交互的结果图11-8显示Add Title 的设计序列图操作和说明同代码中的一样可以用协作图来代替序列图如图11-9所示注意无论怎样Rational Rose并不完全支持UML 有关协作图的全部概念在其它的方面消息编号机制则比较简单给每一条消息一个序列号1, 2, 3, 等等因此Rational Rose 设计模型中的协作图是序列图的简化的版本它并没有显示UML 协作图的所有特点很难将一个复杂的序列图转换成Rational Rose 4.0中的协作图而一个UML 协作图覆盖同样的序列图是没有任何问题的因此还没有出现过将设计模型中的更复杂的序列图转换成Rational Rose 模型中的协作图11.3.3 用户接口设计在设计阶段进行的一项特殊活动是产生用户接口定义用户接口的外观和感觉这项活动是在分析阶段初始化且与其它活动分开来做但同其它的工作同步进行(如何设计成功的用户接口超出了本书的范围可参考其它的有关文献)基于用例的图书馆应用中的用户接口被分成四部分每一部分在主窗口菜单中有一个独立的菜单包如下所示z 功能(Functions)系统中的基本功能窗口也就是说借书还书和预订z 信息(Information)浏览系统中的信息窗口有关标题和借阅者的信息z 维护(Maintenance)维护系统的窗口也就是说增加更新删除标题借阅图11-8 增加标题(Add Title) 用例的序列图上述所有窗口均在Symantec Visual Cafe(SVC)中画出在SVC 中可视化组件如按钮编辑条可以很方便地放入窗口中然后SVC 自动产生创建窗口所需的代码包括添加放入窗口中的组件的属性如给AWT Button 类添加一个属性ok-Button 指示该按钮为OK 按钮属性是自动是产生的所以它们的缺省名字类似于label1, label2,textField1, 等等在SVC中为用户产生的事件如单击鼠标选择菜单等指定事件处理器是很方便的具体做法是选择一个指定组件如okButton 然后选择组件上需要处理的事件如Clicked 事件随后SVC 就自动产生一个方法okButton_Clicked 当OK 按钮被单击时调用该方法当研究用户接口包中的类时有一条原则非常重要如当用户选择窗口中的findTitleButton 时方法findTitleButton_Clicked 被调用当列表项itemList 中的某一项被选中时方法itemList_Selected 被调用,当菜单项Lending Item被选中时方法LendingItem_Action 被调用图11-10显示了用户接口包中的类图中的一个例子在图中可以发现这类事件处理器按钮标签编辑条的属性在图中没有显示出来最终的用户接口由一个带菜单包和一个图形画面的主窗口组成从主窗口可以访问到其它所有窗口一般来说每一个其它的窗口代表系统的某一服务被映射到对应的初始用例(虽然并不是所有的用户接口都必须从用例中映射而来)图11-9 用正确的UML 语法表示的Add Title 用例的协作图图11-10 Function菜单中的用户接口类(在模型中的Function类图中显示)典型地所有关联是一对一且所有关联都表明在某一点的关联窗口类被创建或在某一点关联的业务对象类被访问下面不将关联进一步细化11.4 实现构造或实现阶段是指编程实现类在系统需求中要求系统可以运行在许多不同的处理器和操作系统上所以选择Java来实现系统但是有一点需要说明在这个应用中Java是作为一般的编程语言来使用的没有使用Java的Applet因为Java Applet不能访问客户端的文件系统Java很容易将逻辑类映射到代码组件因为这种映射是类和Java代码文件之间的一对一的映射(和一对一地映射到一个可执行的 .class文件)Java也要求文件名应该同它包含的类的类名一样图11-11说明设计模型中的组件图包含(在本例中)一个从逻辑的类到组件的简单映射逻辑包也被映射到对应的组件包所以组件包中的UI包包含逻辑包中的UI包每个组件包含一条到逻辑类的描述的链接使得可以方便地在逻辑视图与组件视图间切换(即使在本例中使用的仅仅是文件名)组件间相关性不在组件图中表示(除了业务对象包)图11-11 标志实现域类的组件的组件图类间的关联是双向的对于编码从下列设计模型中的图获得规格说明类说明(Class Specifications)每一个类的规格说明详细显示必须有的属性和操作类图(Class Diagrams)类图显示类的静态结构和类间的关系状态图类的状态图显示类的所有可能到达的状态以及需要处理的状态转移(以及触发状态转移的操作)动态图(序列图协作图活动图)显示类中方法的实现以及其它对象如何使用类的对象用例图和说明当开发人员需要了解更多有关如何使用系统的信息时(当开发人员感到他正从细节中迷失时)可以通过该图来了解使用系统的结果很自然地在编码阶段设计模型中的缺陷可能会体现出来因此可能增加新的操作或修改已有的操作也就是说开发人员不得不改变设计模型所有的工程都可能会碰到这种情况重要的是使设计模型与编码同步起来使得模型可以作为系统的最终文档这里给出的Java代码例子是有关Loan类和TitleFrame类当研究这些代码时脑海中想着UML模型并试图了解如何将UML结构转移成代码考虑下面的内容Java包说明就是指明类属于哪一个包是组件包还是逻辑视图私有属性对应于模型中的指定的属性同样Java方法对应于模型中的操作ObjId类(对象标志符)被用来实现关联意思是通常情况下关联是同类保存在一起的(因为ObjId类具有持续性)第一个代码例子是有关Loan类它是一个业务对象类用来存储有关借书的信息实现是比较直接的代码也比较简单因为该类主要是用来存储信息大部分功能是从数。