UML与面向对象程序设计原则

news/2024/10/23 19:06:43

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

实验2 类和对象_基础编程1

实验任务1 代码: t.h:1 #pragma once2 3 #include<string>4 5 class T {6 public:7 T(int x = 0, int y = 0);8 T(const T& t);9 T(T&& t); 10 ~T(); 11 void adjust(int ratio); 12 void display()const; 13 private: 14 int …

第一次团队作业——“行趣”智能旅游软件

作业所属的课程 软件工程2024作业要求 2024秋软工实践团队作业-第一次作业的目标 开发一款基于LLM大模型接口的软件,为这个软件做需求分析团队名称 十光年团队成员学号-姓名 施靖杰-102201327邓才慧-102201102陈宇尧-102201119陆旭东-102201118黄宇舟-102201331邱予-102202121…

七月在线公开课笔记-二十三-

七月在线公开课笔记(二十三) 人工智能—机器学习中的数学(七月在线出品) - P1:Taylor展式与拟牛顿 - 七月在线-julyedu - BV1Vo4y1o7t1 这次我们探讨它的展示与它的相关应用,如米牛顿。我们首先给出塔的展示的本身的,它的定义,它的展示的公式的本身。然后我们利用它来计…

七月在线公开课笔记-二十七-

七月在线公开课笔记(二十七) 人工智能—机器学习公开课(七月在线出品) - P25:【公开课】数据挖掘与机器学习基础 - 七月在线-julyedu - BV1W5411n7fg 可以是吧?好,那么我们稍等一下啊,稍等一下我们。在8点钟我们就准时开始我们的一个直播的内容。对。那么各位同学之前有…

七月在线公开课笔记-二十六-

七月在线公开课笔记(二十六) 人工智能—机器学习公开课(七月在线出品) - P18:世界杯数据分析案例 - 七月在线-julyedu - BV1W5411n7fg 然后我们来做个分析吧,所以大家喜欢做一些比赛的分析,对吧?然后大家最关注的当然是决赛半决赛啊,可能也多多分析一下,分析到4分之1…

10.22-10.23

A.异或和 CF1261F 做过类似的题的话,\(O(n^2\log^2v\log(n^2\log^2v))\) 应该算是暴力分了。 显然这过不了,不然就不是 *3100 了。 主要的瓶颈在于异或完后产生了大量的线段,而且里面大多数是没用的。 于是赛时写出了一个绝唐的优化点击查看代码 for (int i = 0;i < seg[…

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm),解决老代码使用的node.js 比较旧

一、卸载node如果你已经安装了node,那么你需要先卸载node(不然安装nvm可能会失败),如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底删除node在看看你的node安装目录中还有没有node文件…

1024 程序员节,我做了个闯关小游戏!

1024 程序员节到了,首先祝各位程序员们节日快乐,代码零 Bug!大家好,我是程序员鱼皮。1024 程序员节到了,首先祝各位程序员们节日快乐,代码零 Bug! 在这个特殊的日子,为了帮助大家轻松了解计算机编程相关的实用知识,帮助程序员朋友们巩固基础、检验自己的技术水平,我带…