2024.10.24

设计模式实验一

软件设计                  石家庄铁道大学信息学院

 

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

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

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

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

 
   

 

 

[实验任务一]:UML复习

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

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

1.  继承关系

表示一个类(子类)继承了另一个类(父类)的属性和方法。

 

2.  实现关系

表示一个类实现了一个接口。

 

 

 

3.  关联关系

表示类之间的一种使用关系,通常是一个类的对象使用另一个类的对象。

 

4.  聚合关系

表示一种“整体-部分”的关系,但部分可以独立于整体存在。

 

 

5.  组合关系

表示一种更强的“整体-部分”关系,部分不能独立于整体存在。

 

6.  依赖关系

表示一个类依赖于另一个类,通常是临时使用。

 

 

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

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

实验要求:

1.提交源代码和对应的数据库文件(注意将此模块保存,以备以后使用);

2.注意编程规范。

源代码:import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

 

// 用户类

class User {

    private String username;

    private String password;

 

    public User(String username, String password) {

        this.username = username;

        this.password = password;

    }

 

    public String getUsername() {

        return username;

    }

 

    public String getPassword() {

        return password;

    }

}

 

// 登录验证接口

interface LoginValidator {

    boolean validate(User user);

}

 

// 密码长度验证器

class PasswordLengthValidator implements LoginValidator {

    @Override

    public boolean validate(User user) {

        return user.getPassword().length() >= 6;

    }

}

 

// 用户名密码匹配验证器(从 MySQL 数据库中验证)

class UsernamePasswordValidator implements LoginValidator {

    @Override

    public boolean validate(User user) {

        String url = "jdbc:mysql://localhost:3306/tb_user?serverTimezone=GMT%2B8&useSSL=false";

";

        String usernameDB = "root ";

        String passwordDB = "ADGJL12345syl ";

        try (Connection connection = DriverManager.getConnection(url, usernameDB, passwordDB)) {

            String query = "SELECT * FROM users WHERE username =? AND password =?";

            try (PreparedStatement statement = connection.prepareStatement(query)) {

                statement.setString(1, user.getUsername());

                statement.setString(2, user.getPassword());

                try (ResultSet resultSet = statement.executeQuery()) {

                    return resultSet.next();

                }

            }

        } catch (SQLException e) {

            e.printStackTrace();

            return false;

        }

    }

}

 

// 登录服务类

class LoginService {

    private final List<LoginValidator> validators;

 

    public LoginService() {

        validators = new ArrayList<>();

        validators.add(new PasswordLengthValidator());

        validators.add(new UsernamePasswordValidator());

    }

 

    public boolean login(User user) {

        for (LoginValidator validator : validators) {

            if (!validator.validate(user)) {

                return false;

            }

        }

        return true;

    }

}

 

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

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

实验要求:

1.  提交源代码;

 // 画笔大小抽象类

abstract class PenSize {

    public abstract void drawSize();

}

 

// 小画笔大小具体类

class SmallPenSize extends PenSize {

    @Override

    public void drawSize() {

        System.out.println("Drawing with small size.");

    }

}

 

// 中画笔大小具体类

class MiddlePenSize extends PenSize {

    @Override

    public void drawSize() {

        System.out.println("Drawing with middle size.");

    }

}

 

// 大画笔大小具体类

class BigPenSize extends PenSize {

    @Override

    public void drawSize() {

        System.out.println("Drawing with big size.");

    }

}

 

// 画笔颜色抽象类

abstract class PenColor {

    public abstract void drawColor();

}

 

// 红色画笔颜色具体类

class RedColor extends PenColor {

    @Override

    public void drawColor() {

        System.out.println("Drawing with red color.");

    }

}

 

// 绿色画笔颜色具体类

class GreenColor extends PenColor {

    @Override

    public void drawColor() {

        System.out.println("Drawing with green color.");

    }

}

 

// 画笔类

class Pen {

    private PenSize size;

    private PenColor color;

 

    public Pen(PenSize size, PenColor color) {

        this.size = size;

        this.color = color;

    }

 

    public void draw() {

        size.drawSize();

        color.drawColor();

    }

}

2.画出重构后的类图。

 

 

posted @ 2024-12-25 02:02  cvjj  阅读(22)  评论(0)    收藏  举报