9.27

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、掌握面向对象程序设计中类与类之间的关系以及对应的UML类图;

2、理解面向对象程序设计原则。

 

[实验任务一]:UML复习

阅读教材第一章复习UML,回答下述问题:

Q:面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。

 

A:1.关联关系:一种结构化的关系,用于表示一类对象与另一类对象之间有联系,如登录和注册按钮。

 

1.1双联关系:默认情况下,关联式双向的,有两个角色名。如顾客购买商品并拥有商品。

 

1.2单联关系:类关联关系也可以是单项的,只有一个角色名。如顾客拥有地址。

 

 

1.3自关联关系:在系统中可能存在一些类的属性对象类型为该类本身。如一个节点类的成员又是节点对象。

 

 

1.4多重关联关系:表示一个类的对象与另一个类的对象连接的个数。如一个界面可以拥有零个或多个按钮,但是一个按钮只能属于一个界面。

 

 

1.5聚合关系:表示一个整体和部分的关系,成员类是整体类的一部分,即成员对象是整体对象的一部分,成员对象可以脱离对象独立存在。如汽车发动机是汽车的组成部分,但是汽车发动机可以独立存在。

 

 

1.6组合关系:表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存周期。如人的头没了,那嘴巴也没了。

 

 

依赖关系:特定事物的改变有可能会影响到使用该事物的其他事务,在需要表示一个事物使用另一个事物时的依赖关系。如驾驶员开车。

 

 

泛化关系:用于描述父类(基类、超类)和子类(派生类)之间的关系。

依赖关系:特定事物的改变有可能会影响到使用该事物的其他事务,在需要表示一个事物使用另一个事物时的依赖关系。如驾驶员开车。

 
 
泛化关系:用于描述父类(基类、超类)和子类(派生类)之间的关系。
 
 
4.接口与实现关系:类实现接口,类中的操作实现了接口中所声明的操作。
 
 
[实验任务二]:单一职责原则
登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单一职责原则重构后的类图实现这一模块。
 
实验要求:
 
提交源代码和对应的数据库文件(注意将此模块保存,以备以后使用);
SET FOREIGN_KEY_CHECKS=0;
 
-- ----------------------------
        -- Table structure for `login`
        -- ----------------------------
        DROP TABLE IF EXISTS `login`;
        CREATE TABLE `login` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `userName` varchar(255) NOT NULL,
        `userPassword` varchar(255) NOT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
        -- ----------------------------
        -- Records of login
        -- ----------------------------
        INSERT INTO `login` VALUES ('1', 'admin', '123456');
DBUtil.java文件
 
package login;
 
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
public class DBUtil {
 
    public static final String url="jdbc:mysql://localhost:3306/db1";//URL
    public static final String user="root";//用户名
    public static final String password="123456";//密码
 
    /**
     * 连接数据库
     * @return
     */
    public static Connection getConnection(){
        Connection conn=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
            conn=DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");
        }catch(Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
 
    /**
     * 关闭数据库
     */
    public static void close(Connection conn,PreparedStatement pstm) {
 
        System.out.println("关闭SQL(conn,pstm)");
        if(pstm!=null) {
            try {
                pstm.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
 
        if(conn!=null) {
            try {
                conn.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
 
    }
 
    public static void close(Connection conn,PreparedStatement pstm,ResultSet rs) {
 
        System.out.println("关闭SQL(conn,pstm,rs)");
        if(pstm!=null) {
            try {
                pstm.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
 
        if(conn!=null) {
            try {
                conn.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
 
        if(rs!=null) {
            try {
                rs.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
 
    }
 
// public static void main(String[] args) {
// getConnection();
// }
}
LoginFrom.java
 
package login;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
 
@SuppressWarnings("serial")
public class LoginForm extends JFrame implements ActionListener {// 负责页面显示
 
    JTextField text_name = new JTextField();
    JPasswordField text_password = new JPasswordField();
    private boolean login=false;
 
    public void init() {// 用于初始化按钮、文本框等界面控件
        // 在init中实例化JFrame类的对象
        JFrame frame = new JFrame();
        // 设置窗体对象的属性值
        frame.setTitle("登录");// 设置窗体标题
        frame.setSize(400, 250);// 设置窗体大小,只对顶层容器生效
        frame.setDefaultCloseOperation(3);// 设置窗体关闭操作,3表示关闭窗体退出程序
        frame.setLocationRelativeTo(null);// 设置窗体相对于另一组间的居中位置,参数null表示窗体相对于屏幕的中央位置
        frame.setResizable(false);// 禁止调整窗体大小
        frame.setFont(new Font("宋体", Font.PLAIN, 14));// 设置字体,显示格式正常,大小
 
        // 实例化FlowLayout流式布局类的对象,指定对齐方式为居中对齐组件之间的间隔为10个像素
        FlowLayout fl = new FlowLayout(FlowLayout.CENTER, 10, 10);
        // 实例化流式布局类的对象
        frame.setLayout(fl);
 
        // 实例化JLabel标签对象,该对象显示“账号”
        JLabel labname = new JLabel("Name:");
        labname.setFont(new Font("宋体", Font.PLAIN, 14));
        // 将labname标签添加到窗体上
        frame.add(labname);
 
        // 实例化JTextField标签对象化
        Dimension dim1 = new Dimension(300, 30);
        text_name.setPreferredSize(dim1);// 设置除顶级容器组件以外其他组件的大小
        // 将textName标签添加到窗体上
        frame.add(text_name);
 
        // 实例化JLabel标签对象,该对象显示“密码”
        JLabel labpass = new JLabel("Password:");
        labpass.setFont(new Font("宋体", Font.PLAIN, 14));
        // 将labpass添加到窗体上
        frame.add(labpass);
 
        // 设置大小
        text_password.setPreferredSize(dim1);
        // 添加到窗体
        frame.add(text_password);
 
        // 实例化JButton组件
        JButton button1 = new JButton();
        // 设置按键的显示内容
        Dimension dim2 = new Dimension(100, 30);
        button1.setText("登录");
        button1.setFont(new Font("宋体", Font.PLAIN, 14));
        // 设置按键大小
        button1.setSize(dim2);
 
        button1.addActionListener(new ActionListener() {// 给按钮添加事件接收器
            @Override
            public void actionPerformed(ActionEvent e) {// 接受到事件后,进行下面的处理
                validate();
            }
        });
 
        frame.add(button1);
        frame.setVisible(true);// 窗体可见,一定要放在所有组件加入窗体后
    }
 
    public void display() {// 用于向界面容器中增加页面控件并显示窗口
        int i = 3;// 3次登录机会
        Dimension dim3 = new Dimension(300, 30);
 
        // 生成新界面
        javax.swing.JFrame login2 = new javax.swing.JFrame();
        login2.setSize(400, 200);
        login2.setDefaultCloseOperation(3);
        login2.setLocationRelativeTo(null);
        login2.setFont(new Font("宋体", Font.PLAIN, 
 
posted @ 2025-01-07 22:20  kxzzow  阅读(56)  评论(0)    收藏  举报