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.画出重构后的类图。

 

posted @ 2024-10-23 19:04  艾鑫4646  阅读(7)  评论(0编辑  收藏  举报