本课目的是提供一门实用的、易于理解的面向对象设计的入门教程。总体设想是强调设计的表示法与代码之间的联系,把设计表示法的真实含义传授给学生。为此提供提供了UML描述的面向对象开发的完整示例,即从需求讲到完整的可执行代码:
闭卷考试:18周周六3-4节
周时 | 内容 | 小结 |
---|---|---|
1周 | UML导论 | 软件开发分阶段进行,模型在每个阶段的作用是在一个抽象层次上描述系统的特定方面。 |
2-3周 | 对象建模、软件开发过程 | 对象模型不是UML模型,它将运行程序视为一个对象网络,通过对象内和对象间的消息交互完成计算。UML统一软件开发过程是一种用例驱动的过程。 |
4-13周 | 餐馆系统的需求、分析、设计、实现 | 1. 如何通过用例图(use case)对餐馆业务进行建模?习题课 I 2. 如何通过实化用例图得到作为分析结果的顺序图?在细化用例图的过程中,如何把领域模型扩展为分析模型? 3. 如何利用过去的设计经验(如MVC模式)进行软件架构设计? 4. 面向对象方法学中分析与设计的区别与联系有哪些? 5. 如何理解数据更新显示时应用层可以用观察者模式通知表示层? 6. 什么是持久数据存储?将类图影射到关系数据库模式的基本策略是什么? 7. 什么是状态图?对象行为有哪两方面在交互图中没有刻画而是在状态图中刻画的? 8. 解释说明你对应用框架的理解。 9. 如何实现类、关联、继承/泛化、顺序图和状态图?习题课 II |
14周 | 类图和对象图 | C53 |
15周 | 协作图 | C53 |
16周 | p176状态图, p194 ex10.1 | C53 |
可选 | 原则和模式 | C63 |
工作历史
A four-function calculator with the following functions:
Addition - adds two numbers: n1 + n2.
Subtraction - subtracts number two from number one: n1 - n2.
Multiplication - Multiplies two numbers: n1 * n2.
Division - divides number two into number one: n1 / n2.Use JButton for the numbers and functions.
Use Jmenu for File and help.
Create a class to respond to the events caused by numbers, functions, exit, help and about functionality.
Use BorderLayout to layout various components in the Calculator Frame. A BorderLayout lays out a container, arranging and resizing its components to fit in five regions: north, south, east, west, and center.
Calculator.java -- 1st implementation from beginer-java-tutorial
CaculatorApplet.java -- 2nd implementation from happycodings
Java Date Class Example
程序运行结果:
Date2 is before date1: false Date2 is after date1: true compare date1 to date2: -1 compare date2 to date1: 1 compare date1 to date1: 0 Are Dates equal???: true If date is 3-8-1990, 652300200000 this much time have passed.
类图及其运行(对象图/模型):
库存控制系统:零件、部件==>
订购支付, 对比:网上书店(不含支付) ==>
示意图:更实际的库存控制系统
Java.util.Vector(向量)实现类似动态数组的功能。创建了一个向量类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型也不需预先选定向量的容量,并可方便地进行查找。对于预先不知或不愿预先定义数组大小,并需频繁进行查找、插入和删除工作的情况,可以考虑使用向量类。
程序运行结果:
The vector v1 is: [one, 1, 1, two, 2, 1, 1] The vector v1(used method insertElementAt())is: [one, 1, three, 3.9, 1, two, 2, 1, 1] The vector v1(used method setElementAt()) is: [one, 1, four, 3.9, 1, two, 2, 1, 1] The vector v1(used method removeElement())is: one four 3.9 1 two 2 1 1 The position of object 1(top-to-bottom):3 The position of object 1(tottom-to-top):7 The new vector(resized the vector)is: [one, four, 3.9, 1]
* 统一开发过程:工作流中的阶段性成果
* Calculator软件的统一开发过程
Q: 即使假设这是一个单人开发的桌面应用,开发过程中软件系统也会出现多个版本,如何理解?
编写代码的过程中,修改、测试、出错调试总是难免的;
运行条件/环境变了;
界面功能有变化;
非界面的功能有变化;
其它因素(如主题、文档、与其他系统集成等等)
Q: 看代码画对象图,或者看对象图写代码,判断对象图是否正确?
Q: 判断用例图是否正确?错的逐一指出错在何处,对的进一步给出用例说明(正常/例外执行路径)
采用人工管理图书的办法,不仅效率低、易出错、手续繁琐,不但给图书管理人员带来了诸多不变,也要耗费大量的人力。为了满足图书管理员对图书馆书籍、读者资料、借还书等进行高效的管理,在工作人员具备一定的计算机操作能力的前提下,开发一套完善的图书管理软件以提高图书馆的管理效率。
15-04-21 复习P74-5.2 对象设计, P76-5.3.1 层次架构, MVC设计模式
除了关于对象应该如何设计的通用原则之外,能够利用过去的设计经验提供一些示例说明那些设计选择有成效,而那些没有成效也是很有用的。与其将经验整理成抽象的原则或比喻,倒不如把这些在过去使用过的并且成功的设计策略编写为非常具体的设计策略的示例给出。习惯上将这样的示例称为模式(pattern)。
* 15-04-28 补充如何用Swing构造Java应用界面, 从Java Swing基础到P35-餐馆系统的图形用户界面(GUI)设计
Swing是随Java一起发行的构造图形用户界面(GUI, graphical user interface, 1.8.0_45-b14 / JDK 8u45)的开发包,类似的开发包还有AWT(Abstract Window Toolkit),以及独立发行的开源SWT(Standard Widget Toolkit, 4.4.2 Final Release - February 4, 2015)。著名的集成开发环境(IDE)eclipse就是用SWT开发的。
Swing/AWT界面开发基础:
1. 使用java.swing包中JFrame构造空窗口,EmptyWindow.java
2.1 空窗口中增加界面组件:使用java.swing包中JFrame, JButton, JTextField,以及java.awt包中的BorderLayout, Container构造一个包含按钮和文本框的GUI。ComponentsWindow1.java
2.2 对界面组件增加控制(事件监听):实现ActionListener接口,实现public void actionPerformed(ActionEvent evt)方法完成对界面组件的控制。ComponentsWindow2.java
3. 界面稍微复杂一点的,如Calculator软件
开发它使用(1) java.awt包中的BorderLayout, Color, Container, FlowLayout, Font, GridLayout, Window; (2) java.awt.event包中的ActionEvent, ActionListener, KeyEvent, WindowAdapter, WindowEvent; (3) javax.swing包中的JButton, JDialog, JFrame, JLabel, JMenu, JMenuBar, JMenuItem, JPanel, JTextArea, KeyStroke。
4. AWT/Swing有关类图
Jesat_v1.2界面设计展示
5. IDE下GUI开发更容易:LoginFrame.java。
15-05-05 P35-餐馆系统的图形用户界面(GUI)设计
* 15-05-26 P64-应用框架
实现类(单件类)、关联及重数约束、继承/泛化、顺序图和状态图的方法。
15-06-02 习题课 教程
P89-Ex5.3 修改P82-图5.6增加与date有关的约束
P89-Ex5.6 顺序图-记录未预约(Walkin)
P107-6.7 试图取消已就座预定(P105图6.16)的出错处理
没有必要为系统中的每个类都画状态图。判断是否为某个类画状态图时,最重要的是该类的实例对象是否展示出依赖状态的行为。在一个实际运行的餐馆,空桌子和被占用的桌子显然有着很大的区别,为桌子画张如图6.8所示的状态图似乎是有可能的。
然而在餐馆系统里没有哪一个消息要依赖于桌子是否被占用,也没有消息导致桌子从空变为被占用的状态。因此,在当前系统需求下没有必要为桌子画状态图。
再次强调,只为那些具有“有意义行为的”类画状态图,所谓“有意义”是指该类(1)以某个固定次序接受消息,或者(2)具有依赖状态的行为,在不同时间以不同方式响应相同的消息。
P123-7.2 多台PC上部署
补充习题:银行向顾客Customer提供多种账户,包括活期账户(Current Account)、存款账户(Deposit Account)和在线账户(Online Account)。假如活期账户提供了一个支票薄功能,需要记录记录该账户发放的支票号码的范围。假设只要在一个在线账户上进行存款deposit(amt)和提款withdraw(amt),都要向账户所有者发送一个电子邮件消息要求确认。根据下图所示的设计作答:
实现图中所有类及其继承关系。
在图中增加Customer类和OnlineAccount类的设计。
实现Customer类和OnlineAccount类。
参考资料
教材
面向对象设计UML实践(第2版),Mark Priestley著,龚晓庆等译,清华大学出版社 ISBN:7302105871 定价:39元 出版日期:2005年5月