9.30
今天完成软件设计的实验一。
[实验任务一]:UML复习
阅读教材第一章复习UML,回答下述问题:
面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。
1、关联关系
①、单向关联
②、双向关联
③、多重性关联
④、聚合关联
⑤、组合关联
2、依赖关系
3、泛化关系
[实验任务二]:单一职责原则
登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单一职责原则重构后的类图实现这一模块。
Init方法用于初始化按钮、文本框等界面控件;display方法用于向界面容器中增加界面控件并显示窗口;validate方法供登录按钮的事件处理方法调用,用于调用与数据库相关的方法完成登录处理,成功则进入,否则提示错误;getConnection方法用于获取数据库连接对象Connection来连接数据库;findUser方法用于根据用户名和密码查询数据库中用户是否存在,存在为True,否则为false,需调用getConnection;main为主函数,即系统的入口
按照功能拆分成四个类:
类LoginForm负责界面显示,只包含与界面有关的方法和事件处理方法;
类UserDAO负责用户表的增删改查操作,封装了对用户表的全部操作代码,登录本质上是一个查询用户表的操作。
类DBUtil负责数据库的连接,可供多个数据库操作类重用;
类MainClass负责启动系统。
源代码:
1、BDUtil
package wufa;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/login";
private static final String USER = "root";
private static final String PASSWORD = "123456789";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
2、UserDAO
package wufa;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDAO {
public boolean findUser(String username, String password) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
String sql = "SELECT * FROM users WHERE username=? AND password=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
rs = pstmt.executeQuery();
return rs.next(); // 如果查询结果存在,则返回true
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return false;
}
}
3、LoginForm
package wufa;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginForm extends JFrame {
private JTextField usernameField;
private JPasswordField passwordField;
private JButton loginButton;
private JLabel messageLabel;
public LoginForm() {
init();
}
private void init() {
setTitle("Login Form");
setSize(300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel panel = new JPanel();
JLabel usernameLabel = new JLabel("Username:");
usernameField = new JTextField(20);
JLabel passwordLabel = new JLabel("Password:");
passwordField = new JPasswordField(20);
loginButton = new JButton("Login");
messageLabel = new JLabel("");
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
validate();
}
});
panel.add(usernameLabel);
panel.add(usernameField);
panel.add(passwordLabel);
panel.add(passwordField);
panel.add(loginButton);
panel.add(messageLabel);
add(panel);
}
private void validate() {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
UserDAO userDAO = new UserDAO();
if (userDAO.findUser(username, password)) {
messageLabel.setText("Login successful!");
// 进行后续操作,比如打开新的窗口等
} else {
messageLabel.setText("Invalid username or password.");
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
LoginForm form = new LoginForm();
form.setVisible(true);
});
}
}
3、MainClass
public class MainClass {
public static void main(String[] args) {
// 启动登录界面 SwingUtilities.invokeLater(() -> {
LoginForm form = new LoginForm();
form.setVisible(true);
});
}
}
实验要求:
[实验任务三]:依赖倒转原则与合成复用原则
在一画图软件中提供了多种大小不同的画笔,并且可以给画笔指定不同的颜色,某设计人员对画笔进行了如上图所示的设计。通过分析,可以发现增加画笔的种类和颜色会使得系统中类的数目急剧增加,请根据合成复用原则和依赖倒转原则对上述设计进行重构。
实验要求:
1.提交源代码;
2.画出重构后的类图。
型号抽象类
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 abstract class Color {
public abstract void colorPen();
}
具体颜色类
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());
}
}