9.26
[实验任务一]:UML复习
阅读教材第一章复习UML,回答下述问题:
面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。
关联(Association):
- 表示类之间的“有一个”(has-a)关系。
- 例如,一个班级和学生之间的关系。
聚合关联
· 聚合(Aggregation)关系表示整体与部分的关系
· 在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体
对象独立存在
· 在UML中,聚合关系用带空心菱形的直线表示
组合关联
· 组合(Composition)关系也表示类之间整体和部分的关系,但是在组合关系
中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象
也将不存在
· 成员对象与整体对象之间具有同生共死的关系
· 在UML中,组合关系用带实心菱形的直线表示
容器与成员
依赖(Dependency):
- 依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用
- 该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系
- 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数
- 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方
继承(泛化)关系:
子类(派生类)继承父类(基类)的属性和方法,从而实现代码的重用和扩展。继承可以是单继承(一个子类仅继承一个父类)或多继承(一个子类可以继承多个父类)。
[实验任务二]:单一职责原则
登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单一职责原则重构后的类图实现这一模块。
实验要求:
1. 提交源代码和对应的数据库文件(注意将此模块保存,以备以后使用)
2.
数据库建表
CREATE TABLE users
(
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
); ;
登录 Servlet (LoginServlet.java)
package com.example;
import com.example.newuml.DBUtil;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证用户
try {
if (isValidUser(username, password)) {
response.getWriter().println("<h1>登录成功</h1>");
} else {
response.sendRedirect("index.jsp?error=用户名或密码错误");
}
} catch (Exception e) {
e.printStackTrace(response.getWriter());
}
}
private boolean isValidUser(String username, String password) throws Exception {
String query = "SELECT * FROM users WHERE username=? AND password=?";
try (Connection connection = DBUtil.getConnection();
PreparedStatement pstmt = connection.prepareStatement(query)) {
pstmt.setString(1, username);
pstmt.setString(2, password); // 在此处应使用哈希后的密码进行比较
ResultSet rs = pstmt.executeQuery();
return rs.next(); // 如果用户存在,返回true
}
}
}
....
2.注意编程规范。
[实验任务三]:依赖倒转原则与合成复用原则

在一画图软件中提供了多种大小不同的画笔,并且可以给画笔指定不同的颜色,某设计人员对画笔进行了如上图所示的设计。通过分析,可以发现增加画笔的种类和颜色会使得系统中类的数目急剧增加,请根据合成复用原则和依赖倒转原则对上述设计进行重构。
实验要求:
1. 提交源代码;
public enum Color {
RED, GREEN, BLUE; // 可以根据需要添加更多颜色
}
public enum Size {
SMALL, MIDDLE, BIG; // 可以根据需要添加更多尺寸
}
public class Pen {
private Color color;
private Size size;
public Pen(Color color, Size size) {
this.color = color;
this.size = size;
}
// 其他方法,例如绘图等
}
2.画出重构后的类图。

浙公网安备 33010602011771号