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());

}

}

 

posted @   听着DJ读童话  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示