1、图书管理系统第8次课,图书管理系统的静态结构设计(体系结构与模式)。,今天的工作任务,提交内容,图书管理系统系统类图。,工作任务: 图书管理系统的静态结构设计,提交内容: 系统类图,面向对象设计(OOD) 设计原则 MVC设计模式 DAO模式 类图建模技术系统类图,学习情景图书管理系统体系结构设计 知识要点一览,静态结构设计 类设计 包设计 接口设计 动态结构设计(行为和交互建模) 对象如何进行交互的,知识要点1:面向对象设计,关注,还记得“春晓”吧?,设计1,设计2,设计3,设计4,设计5,同样的需求,可以采取不同的设计方式来完成。,设计的好坏会影响系统的可重用性、可维护性和可扩展性。,知识
2、要点2:设计原则,“开闭”原则 里氏代换原则 合成复用原则 接口隔离原则 依赖倒转原则 迪米特法则,知识要点2:设计原则,课外阅读:Java与模式,抽象,信息隐蔽,模块独立,高内聚,低耦合,设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。,理论在实际中的运用设计模式,提高代码复用 提高可维护性,按照良好的设计原则进行设计,?,?,使用设计模式,先看一下图书管理系统的登陆,知识要点3:MVC设计模式,登陆的状态图,验证通过,验证未通过,将用户名和密码的验证,放在登录界面的“进入系统”按钮中进行。,一种设计:,问题1:扩展性差。目前这个系统只有一个图书馆工作人员使用,因此用户名
3、和密码都是admin,这样验证可行,但是如果以后维护期间,需要增加工作人员或者增加学生、教师等使用角色,系统的扩展性就受到了限制。 问题2:重用性不好。并且不同的角色需要写入不同的验证过程,不能重用。 问题3:界面人员还要考虑算法和逻辑。使界面变得不单一。 如何解决?,第一种设计存在的问题:,新增加一个类UserLoginProcess,该类中有一个方法public boolean login_check(String uname,String upsw),此方法用来进行验证,如果验证通过则返回true给登录界面,否则返回false。,另一种设计:,用户验证处理类,登录界面中,对用户验证处理类
4、的使用,1.良好的封装,将界面和验证逻辑分开,系统结构更清晰。界面人员不用管验证的细节,只需要判断返回值是true还是false即可作出相应的显示操作。 2. UserLoginProcess类还可以提供其他验证操作,包括链接数据库的操作,为系统扩展性提供了接口。 3. UserLoginProcess类中的验证过程可以被重用,即使你再增加若干个不同角色的登录界面,一样可以使用这个类的方法来进行验证,重用性提高。,第2种设计给我们带来什么好处?,第2种设计使用了MVC思想,MVC是Model,View,Controller的缩写。 MVC是Application开发的设计模式,也就是大家所知道
5、的Model2.在MVC的设计模式中,它包括三类对象: (1)模型(Model)对象:是应用程序的主体部分。(2)视图(View)对象:是应用程序中负责生成用户界面的部分。 (3)控制器(Control)对象:是根据用户的输入,控制用户界面数据显示及更新Model对象状态的部分。即要求在Application开发中你把商业逻辑,界面显示,数据分离。,MVC,将界面、处理、数据源分开,MVC结构图,状态查询,通知改变,视图选择,用户请求,状态改变,图书馆系统的MVC结构,用户图形界面类,数据源,业务逻辑和处理类,C,V,M,MVC让图书馆系统的结构变得清晰起来。 但与此同时,我们发现,在图书管理
6、系统的用例中, 有很多都是需要通过访问数据库来进行实现的。如果用户不使用原有的数据库了,使用新的数据库时,程序代码要改动的地方就太多了。怎么办? 有没有什么好的设计模式可以让数据库访问变的可重用,可维护,可扩展呢?,使用DAO模式吧!,?新的问题,知识要点4:DAO设计模式,DAO是Data Access Object的缩写。 数据访问:故名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。,业务逻辑 程序,DAO,DAO模式,DAO模式,1. 封装Data Source(数据源) 例如:Connection conn = DriverMananger.getConnection()就可以
7、把Driver,URL,username,passpword这一些放在DAO中。 如果在维护中,需要更改数据库的类型,例如把MSSQL换成Oracle的话,只需要更改DAO里面的getConnection()里面的Driver,URL即可。 2. 封装对数据库的操作(例如最基本的增、删、改、查操作) 例如:要插入一个新的用户,那么在DAO中我们只需要提供一个insertUser(User user)这一个方法就可以了。具体的操作是在DAO中实现的。 在业务逻辑程序中调用DAO的时候.我们只要知道insertUser(User)是用来插入一个新的用户,而不需要知道是如何实现的。,DAO的功能:,
8、包设计,完成工作任务图书管理系统的体系结构设计,com.lms.ui包中存放界面类,com.lms.process包中存放业务逻辑处理,com.lms.dao包中存放数据访问包,com.lms.dao.base包,类设计主要是DAO实现类设计,com.lms.dao.datasource包,此类映射图书表,此类映射借阅信息表,此类映射学生表,此类映射借阅视图,com.lms.dao.factory包,此包提供了对数据源的访问操作,各类的方法是根据需求规格说明书进行识别出来的,保证能够覆盖需求中提到的对数据库访问的操作。,类的设计相对比较复杂,对大家的要求是要能看懂设计图,理解设计原则。 在进行
9、编码时,能够按照所给的类图实现编码。,注意,选讲知识:,6.3.1 包的名字,和其他建模的元素一样,每个包都必须有一个区别于其他包的名字。模型包的名字是一个字符串,它可分为简单名(simple name)和路径名(path name)。简单名是指包仅含一个简单的名称,路径名是指以包位于的外围包的名字作为前缀的包名。如下图所示,6.3.2 包拥有的元素,包是对模型元素进行分组的机制,它把模型元素划分成若干个子集。包可以拥有UML中的其他元素,包括类、接口、组件、节点、协作、用例和图,包甚至还可以包含其他包。如图所示,可以用文字或者图形的方式来显示包的内容。,6.3.3 包的可见性,包的可见性用来
10、控制包外界的元素对包内元素的可访问权限,这一点和类的可见性类似。可见性可以分成3种。(1)公有访问(public):包内的模型元素可以被任何引入此包的其他包的内含元素访问。公有访问用前缀于内含元素名字的加号(+)表示。 (2)保护访问(protected):表示此元素能被该模型包在继承关系上后继模式包的内含元素访问。保护访问用前缀于内含元素名字的号()表示。 (3)私有访问(private):表示此元素可以被属于用一包的内含元素访问。私有访问用前缀于内含元素名字的减号()表示。,6.3.4 引入与输出,在UML里,引入一个包中的元素可以单向的访问另一个包中的元素。引入(import)关系用构造
11、型的import来修饰。包中具有公有访问权限的内含元素称为输出(export)。如图所示,包GUI有两个公共类Window和Form,类EvenHandler是受保护的,不能被包输出。,6.3.5 包中的泛化关系,和类间的泛化关系类似,包间也存在着泛化关系。包间的泛化关系也像类那样遵循替代原则,特殊包可以应用到一般包被使用的任何地方。包间还存在另一种关系:引入和访问依赖,用于在一个包引入另一个包输出的元素。如图所示,包GUI包含两个公共类Window和Frame,一个受保护类EvenHandler,当为较复杂的系统建模时,使用包是非常有效的建模方法。包将建模元素按语义分组,从而使得复杂的系统模
12、型能够被构造、表达、理解和管理。 建立包图的具体做法如下。 (1)分析系统模型元素(通常是对象类),把概念上或语义上相近的模型元素纳入一个包。 (2)对于每一个包,标出其模型元素的可视性(公共、保护或私用)。 (3)确定包与包之间的依赖关系,特别是输入依赖。 (4)确定包与包之间的泛化关系,确定包元素的多重性与重载。 (5)绘制包图。 (6)包图精化。,6.3.7 包图建模技术,类图工具箱,类规范,General标签 名称(Name) 构造型(Stereotype) 输出控制(Export Control),类规范,Detail标签 多重性(Multiplicity) 存储需求(Space)
13、并发性(Concurrency),类规范,Attributes标签 Operation标签 Relations标签 Nested标签 创建嵌套类 右单击标签中任一空白处,从快捷菜单中选择Insert,输入嵌套类名称; 按一般方法创建父类和嵌套类:在浏览器中,将嵌套类拖放到父类。,类规范,Components标签 显示用于实现系统中类的构件 复选标记框“Show all components”表示是否要显示模型中的所有构件;如果选中该标记,则显示系统中的所有构件;否则,只显示实现所选类的构件 显示构件时,同时还显示构件所属的包,以及实现所采用的编程语言,属性规范,General标签 属性数据类型
14、(Type) 属性构造型(Stereotype) 属性的初值(Initial) 输出控制(Export Control),Detail标签 属性控制(Containment) By value:按数值 By reference:按引用 Unspecified:未指定 静态属性(Static) 派生属性(Derived),属性规范,操作规范,General标签 返回值的类型(Return) 构造型(Stereotype) 输出控制(Export Control),操作规范,Detail标签 操作变元(argument) 操作协议(Protocol) 操作限制(Qualification) 内存长
15、度(Size) 时间(Time) 并发性(Concurrency) Sequential:只有一个控制线程时,操作正常工作。 Guarded:存在多个控制线程时,不同线程的类相互协作,操作可正常工作。 Synchronous:存在多个控制线程时,操作可正常工作。,操作规范,异常(Exceptions)标签 操作可抛出的异常 通过其中的4个按钮添加、删除和上、下移动异常,前置条件(Preconditions)标签 前置条件(Preconditions) 指定操作运行之前应满足的条件,即操作的入口行为,通常是不等式 交互图(Interaction Diagram) 说明操作语义的交互图,操作规范,
16、语义(Semantics)标签 语义(Semantics) 指定操作的工作 在文本框中用伪代码描述操作逻辑 交互图(Interaction Diagram) 说明了操作语义的交互图,操作规范,后置条件(Postconditions)标签 后置条件(Postconditions) 指定操作运行之后要符合的条件,即操作的出口行为 交互图(Interaction Diagram) 说明操作语义的交互图,操作规范,General标签 关系名(Name) 一个动词或动词短语,描述关系的作用,是可选的 关系名在关系线上斜体显示,关联规范,General标签 角色(Role) 描述类在关系中的作用 通常是名
17、词或名词短语,显示在起这个作用的类旁边 关联两端的对象,箭头指向的称为“Role A”,箭尾称为“Role B”,关联规范,关联规范,Detail标签 链接元素(Link Element) 链接元素也称为关联类,可以放置与关联相关的属性 使用限制(Constraints) 限制是必须符合的条件。在Rose中可以设置关系的限制条件 输入的限制条件在生成代码时成为说明语句,关联规范,Role A General和Role B General 标签 Rose在生成代码时要给关联建立一个属性 Export Control字段设置该属性的可见性,关联规范,Role A Detail和Role B Det
18、ail标签 多重性(Multiplicity) 表示关联中一个类的几个实例与另一个类的一个实例相联系 包容(Containment) 设置关联属性是按值还是按引用包容 Static 类所有的实例共享的属性 Friend 表示客户类能访问提供者类的非公共属性和操作,关联规范,Key/Qualifier规范 定义 即限定词。在一对多的关联中,索引范围很广,使用限定符可以缩小关联的范围 按下面的步骤可以打开Key/Qualifier规范窗口: 双击关联,打开关联规范窗口; 单击“Role A Detail”标签; 双击Key/Qualifier字段列表中的限定词。,Key/Qualifier规范 定义限定词 右单击关联规范窗口Key/Qualifier字段列表,从快捷菜单中选择Insert,直接在列表中输入限定词和类型 删除限定词 右单击关联规范窗口Key/Qualifier字段列表,从快捷菜单中选择Delete 修改限定词 单击关联规范窗口Key/Qualifier字段列表,直接在列表中编辑限定词和类型。,关联规范,关联的操作 增加关联 改变关系的导航 在要移动的关系端单击右键,在快捷菜单中选择Navigable 删除关联,关联规范,本次课中,用到以下知识: 面向对象设计(OOD)。 MVC设计模式 DAO设计模式 系统类图rose绘制类图,课程小结,