10.2每日总结
软件设计 石家庄铁道大学信息学院
实验1:UML与面向对象程序设计原则
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、掌握面向对象程序设计中类与类之间的关系以及对应的UML类图;
2、理解面向对象程序设计原则。
[实验任务一]:UML复习
阅读教材第一章复习UML,回答下述问题:
面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。
1.继承关系
继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。
2.实现关系
实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系,用一条带空心三角箭头的虚线表示
3.依赖关系
依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。表现在代码层面:类B作为参数被类A在某个method方法中使用。在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示。
- -- - - - ->
4.关联关系
关联体现的是两个类之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面:被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。
用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记
0..1 0..*
------------>
5.聚合关系
聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。表现在代码层面:和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。
0..1
<>------------>
0..*
6.组合关系 组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。
实心菱形加实线箭头表示
0..1
<*>---------->
0..*
[实验任务二]:单一职责原则
登录模块在实际项目开发中很常见,请按照教材28页(PPT49页)利用单一职责原则重构后的类图实现这一模块。
DBUtil
package m;
import java.sql.*;
public class DBUtil {
/*
* 负责数据库的连接,该类可以提供多个数据库操作类重用
* */
private Connection connection=null;
private String urlDb;//数据库
private String user;//用户名
private String password;//密码
public DBUtil() {
}
Connection getConnection()
{
urlDb="jdbc:mysql://localhost:3305/java";//java是数据库名字
user="root";
password="XXX";
try
{
Class.forName("com.mysql.jdbc.Driver");
}catch (ClassNotFoundException e) {
e.printStackTrace();
}
try
{
connection=DriverManager.getConnection(urlDb, user, password);//连接数据库
}catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
LoginForm
package m;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
/*
*
*负责显示界面,因此只包含与界面有关的方法和事件处理方法
*
*/
public class LoginForm extends JFrame {
private UserDAO dao;
private JButton btnLogin=null;
private JButton btnClear=null;
private JTextField txtId=null;
private JTextField txtPwd=null;
private JLabel lblId=null;
private JLabel lblPwd=null;
public LoginForm() {
setVisible(true);
}
public void initControls()//初始化控件
{
btnLogin=new JButton("登录");
btnClear=new JButton("清空");
lblId=new JLabel("账号:");
lblPwd=new JLabel("密码:");
txtId=new JTextField();
txtPwd=new JTextField();
lblId.setBounds(80,50,40,20);
lblPwd.setBounds(80,80,40,20);
txtId.setBounds(130,50,100,20);
txtPwd.setBounds(130,80,100,20);
btnLogin.setBounds(80,110,70,20);
btnClear.setBounds(160,110,70,20);
//添加事件
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Validate();
}
});
btnClear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
txtId.setText("");
txtPwd.setText("");
}
});
}
public void showControls()//面板添加控件
{
Container container=this.getContentPane();
setTitle("登录");
setLayout(null);//绝对布局
setSize(300,250);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置关闭窗口默认方式
setBackground(Color.yellow);
container.add(btnClear);
container.add(btnLogin);
container.add(lblId);
container.add(lblPwd);
container.add(txtId);
container.add(txtPwd);
}
public void Validate()//验证用户 此处提醒Java小白(我自己)JFrame有个validate()函数,如果不自己重新正确命名,就会有意想不到的效果(嘿嘿嘿)。
{
dao=new UserDAO();
String userId=txtId.getText().trim();
String password=txtPwd.getText().trim();
if(dao.findUser(userId, password)==true)
{
JOptionPane.showMessageDialog(null, "登录成功");
}
else
{
JOptionPane.showMessageDialog(null, "登录失败");
}
}
}
MainClass
package m;
public class MainClass {
public MainClass() {
LoginForm form=new LoginForm();
form.initControls();
form.showControls();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new MainClass();//程序入口
}
}
UseDAO
package m;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class UserDAO {
/*
* 负责数据库的增删改查操作,丰庄路对用户表的全部操作代码
*
*/
private DBUtil db=null;
public UserDAO() {
}
boolean findUser(String userId,String userPwd)
{
db=new DBUtil();
Connection connection=db.getConnection();
try
{
Statement sql=connection.createStatement();//获取执行sql的对象
ResultSet resultSet=sql.executeQuery("select * from user where name='"+userId+"' and password='"+userPwd+"'");
resultSet.last();
if(resultSet.getRow()<1) return false;//未找到
else return true;
}catch(Exception e)
{
e.printStackTrace();
return false;
}
}
}
------->
|
|
|>
[实验任务三]:依赖倒转原则与合成复用原则
在一画图软件中提供了多种大小不同的画笔,并且可以给画笔指定不同的颜色,某设计人员对画笔进行了如上图所示的设计。通过分析,可以发现增加画笔的种类和颜色会使得系统中类的数目急剧增加,请根据合成复用原则和依赖倒转原则对上述设计进行重构。
实验要求:
型号抽象类
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());
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)