实验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.重构后的类图