实验1:UML与面向对象程序设计原则

实验1:UML与面向对象程序设计原则

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

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

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

 

[实验任务一]:UML复习

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

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

1. 关联关系

表示一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。子类可以继承父类的特征,同时可以添加新的特征或修改继承的特征。

LoginForm登陆界面中的注册按钮JButton

 

 

其它关联关系

(1) 双向关联,例如:顾客Customer与购买的商品之间的关联

 

 

(2) 单向关联,例如顾客类Customer与其地址Address的关联

 

 

(3) 自关联:与对象本身形成关联关系

 

 

(4) 多重性关联,例如,一个表单可以包含多个按钮

 

 

(5) 聚合关系,整体与部分的关系(部分可以脱离整体而存在)

 

 

(6) 组合关系,整体与部分的关系(共同生死)

 

 

2. 依赖关系(接口以及其实现)

表示一个类在某种程度上依赖另一个类,通常表现为一个类使用了另一个类的某些成员(如方法或属性)。

 

 

3. 泛化关系(继承)

示一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。

 

 

[实验任务二]:单一职责原则

登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单一职责原则重构后的类图实现这一模块。

 

 

实验要求:

1. 源代码和对应的数据库文件

(1)DBUtil

package com.hua.main;

 

import java.sql.*;

import java.sql.SQLException;

 

public class DBUtil {

    //返回数据库连接对象

    public static  Connection getConnection() throws SQLException {

        String url="jdbc:mysql://localhost:3306/wjm";

        String user="root";

        String password="sqlsql";

        try {

            Class.forName("com.mysql.jdbc.Driver");

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

        Connection conn=DriverManager.getConnection(url,user,password);

        return conn;

    }

}

(2) UserDAO

package com.hua.main;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class UserDAO {

    public static boolean findUser(String userName,String userpassword)

    {

        String sql="select * from user where name ="+userName;

        Connection connect = null;

        try {

            connect = DBUtil.getConnection();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        Statement statement;

        try {

            statement = connect.createStatement();

            ResultSet result = statement.executeQuery(sql);

            if(result.next())

            {

                return true;

            }

            else

            {

                return false;

            }

        }

        catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        return false;

 

    }

}

(3) UserDAO

package com.hua.main;

 

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

 

@SuppressWarnings("serial")

 

public class LoginForm extends JFrame implements ActionListener{

    public static JTextField te1;

    public static JLabel L1;

    public static JPasswordField te2;

    public static JLabel L2;

    public static JButton B1;

    public static JFrame frame;

    UserDAO userdao=new UserDAO();

    public void init( )

 

    {

        frame=new JFrame();

        //点击关闭按钮的操作

        L1=new JLabel("账号:");

        te1=new JTextField(25);

        L2=new JLabel("密码:");

        te2=new JPasswordField(25);

        B1=new JButton("登陆");

        B1.addActionListener((ActionListener) this);

    }

 

    public void display( )

    {

        frame.setSize(300,300);

        frame.setLayout(new FlowLayout());

        frame.setTitle("登陆界面");

        frame.add(L1);

        frame.add(te1);

        frame.add(L2);

        frame.add(te2);

        frame.add(B1);

        frame.setVisible(true);

    }

 

    @SuppressWarnings("static-access")

    public void actionPerformed(ActionEvent e) {

        String username=te1.getText();

        String password=String.valueOf(te2.getPassword());

        JDialog frame1 = new JDialog();//构造一个新的JFrame,作为新窗口。

        frame1.setBounds(// 让新窗口与SwingTest窗口示例错开50像素。

                new Rectangle(

                        (int) frame.getBounds().getX() + 50,

                        (int) frame.getBounds().getY() + 50,

                        (int) frame.getBounds().getWidth(),

                        (int) frame.getBounds().getHeight()

                )

        );

        JLabel jl = new JLabel();// 注意类名别写错了。

        frame1.getContentPane().add(jl);

        if(userdao.findUser(username, password))

        {

            jl.setText("登陆成功");

            jl.setVerticalAlignment(JLabel.CENTER);

            jl.setHorizontalAlignment(JLabel.CENTER);

            frame1.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

            frame1.setVisible(true);

        }

        else

        {

            jl.setText("登陆失败");

            jl.setVerticalAlignment(JLabel.CENTER);

            jl.setHorizontalAlignment(JLabel.CENTER);

            frame1.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

            frame1.setVisible(true);

        }

    }

}

 

 

 

 

(4) UserDAO

package com.hua.main;

 

public class MainClass {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        LoginForm loginform=new LoginForm( );

        loginform.init();

        loginform.display();

    }

}

数据库文件:

 

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

 

-- ----------------------------

-- Table structure for user_table

-- ----------------------------

DROP TABLE IF EXISTS `user_table`;

CREATE TABLE `user_table`  (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

  PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

 

[实验任务三]:依赖倒转原则与合成复用原则

在一画图软件中提供了多种大小不同的画笔,并且可以给画笔指定不同的颜色,某设计人员对画笔进行了如上图所示的设计。通过分析,可以发现增加画笔的种类和颜色会使得系统中类的数目急剧增加,请根据合成复用原则和依赖倒转原则对上述设计进行重构。

实验要求:

 

 

1. 源代码

//型号抽象类

public abstract class Size {

    public abstract void sizePen();

}

 

//具体型号类

public class SmallPen extends Size{

    //小型

    public void sizePen() {

        System.out.println("小型");

    }

}

public class MiddlePen extends Size{

    //中型

    public void sizePen() {

        System.out.println("中型");

    }

}

public class BigPen extends Size{

    //大型

    public void sizePen() {

        System.out.println("大型");

    }

}

//具体颜色类

public class GreenPen extends Color{

    public void colorPen() {

        System.out.println("绿色");

    }

}

public class RedPen extends Color{

public void colorPen() {

        System.out.println("红色");

    }

}

 

//钢笔

public class Pen {

    //钢笔

    private Size size;

    private Color color;

    public Size getSize() {

        return size;

    }

    public void setSize(Size size) {

        this.size = size;

    }

    public Color getColor() {

        return color;

    }

    public void setColor(Color color) {

        this.color = color;

    }

}

 

//聚合钢笔

public class MianClass {

    public static void main(String[] args) {

//颜色大小随意组合

        Pen pen=new Pen();

//组合小型红色钢笔

        pen.setSize(new SmallPen());

        pen.setColor(new RedPen());

//组合大型绿色钢笔

        pen.setSize(new BigPen());

        pen.setColor(new GreenPen());

    }

}

 

 

2.重构后的类图

 

 

posted @ 2023-11-24 21:07  杳无音讯  阅读(19)  评论(0编辑  收藏  举报