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.画出重构后的类图。