UML与面向对象程序设计原则
UML与面向对象程序设计原则
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、掌握面向对象程序设计中类与类之间的关系以及对应的UML类图;
2、理解面向对象程序设计原则。
[实验任务一]:UML复习
阅读教材第一章复习UML,回答下述问题:
面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。
- 继承(Inheritance):表示一个类(子类)继承另一个类(父类)的属性和方法。
-
· 关联(Association):表示两个类之间有某种关系。
· 聚合(Aggregation):表示整体与部分的关系,部分可以独立于整体存在。
· 组合(Composition):表示一种强关系,部分不能独立于整体存在。
- ·依赖(Dependency):表示一个类使用另一个类,但不持有其生命周期。
[实验任务二]:单一职责原则
登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单一职责原则重构后的类图实现这一模块。
1.MainClass.java
public class MainClass {
private LoginForm loginForm;
private UserDAO userDAO;
public void main(String[] args) {
init();
display();
}
public void init() {
loginForm = new LoginForm();
userDAO = new UserDAO();
}
public void display() {
loginForm.show();
}
}
2.LoginForm.java
import java.util.Scanner;
public class LoginForm {
private UserDAO userDAO;
public LoginForm() {
userDAO = new UserDAO(); // 初始化UserDAO
}
public void show() {
System.out.println("欢迎登录系统");
handleLogin(); // 调用登录处理方法
}
public void handleLogin() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名: ");
String userName = scanner.nextLine();
System.out.print("请输入密码: ");
String userPassword = scanner.nextLine();
// 处理登录逻辑
boolean isValid = userDAO.findUser(userName, userPassword);
// 根据验证结果进行相应的操作
if (isValid) {
System.out.println("登录成功!");
} else {
System.out.println("用户名或密码错误,请重试。");
}
scanner.close();
}
}
3.UserDAO.java
import
java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDAO {
private DBUtil dbUtil;
public UserDAO() {
dbUtil = new DBUtil();
}
public boolean findUser(String userName, String userPassword) {
String sql = "SELECT password FROM users WHERE username = ?";
try (Connection conn = dbUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, userName);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
String storedPassword = rs.getString("password");
return userPassword.equals(storedPassword); }
} catch (SQLException e) {
e.printStackTrace();
System.out.println("查询用户失败,数据库错误。");
}
return false; // 用户不存在或密码不正确
}
public void addUser(User user) {
String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
try (Connection conn = dbUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
pstmt.executeUpdate();
System.out.println("用户注册成功!");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("注册失败,用户名可能已被占用。");
}
}
public void deleteUser(String userName) {
String sql = "DELETE FROM users WHERE username = ?";
try (Connection conn = dbUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, userName);
pstmt.executeUpdate();
System.out.println("用户删除成功!");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("删除用户失败,数据库错误。");
}
}
}
4.DBUtil.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private String url = "jdbc:mysql://localhost:3306/aixin"; // 数据库URL
private String username = "root"; // 数据库用户名
private String password = "123456"; // 数据库密码
public Connection getConnection() {
Connection connection = null;
try {
// 注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接
connection = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("数据库驱动加载失败。");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("获取数据库连接失败。");
}
return connection; // 返回连接
}
}
6.用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
实验要求:
1.提交源代码和对应的数据库文件(注意将此模块保存,以备以后使用);
2.注意编程规范。
[实验任务三]:依赖倒转原则与合成复用原则
在一画图软件中提供了多种大小不同的画笔,并且可以给画笔指定不同的颜色,某设计人员对画笔进行了如上图所示的设计。通过分析,可以发现增加画笔的种类和颜色会使得系统中类的数目急剧增加,请根据合成复用原则和依赖倒转原则对上述设计进行重构。
重构后的类图:
源代码:
1.Pen.java
public class Pen {
private Color color;
private Size size;
public Pen(Color color, Size size) {
this.color = color;
this.size = size;
}
public void draw() {
System.out.println("Drawing with a " + size + " " + color + " pen.");
}
}
2.Color.java
public enum Color {
RED,
GREEN,
BLUE,
YELLOW;
}
3.Size.java
public enum Size {
SMALL,
MEDIUM,
BIG;
}
实验要求:
1.提交源代码;
2.画出重构后的类图。