大连东软信息学院
OOAD 大作业 1
面向对象系统分析与设计 III 大作业
学号 姓名
<设计模式应用>
1. 优化案例业务介绍
本系统是一个基于 JavaSE 和 JDBC 实现的控制台购物车系统。主要实现的功
能如下:用户登录、用户注册、注册买家、注册卖家、商品列表、加入购物车、
结算、查看购物车、查看订单、订单明细等功能(见代码:改造后代码.zip)
2. 初始方案
(1)原有方案类的设计(类图)
类图 1
类图 2
大连东软信息学院
OOAD 大作业 2
(2)初始代码
CartMain 类代码如下:
public class CartMain {
@Test
public void testDemo() {
Scanner in = new Scanner(System.in);
System.out.println("1. 登录 | 2. 注册");
System.out.println("请选择:");
String choose = in.nextLine();
if (choose.equals("1")) {
Login.loginInfo();
} else if (choose.equals("2")) {
System.out.println("1. 注册买家");
System.out.println("2. 注册商家");
String chooseTwoMenu = in.nextLine();
if (chooseTwoMenu.equals("1")) {
RegisterUser.registerBuyer();
} else if (chooseTwoMenu.equals("2")) {
RegisterUser.registerBusiness();
} else if (!choose.equals("1") || !choose.equals("2")) {
throw new InputMismatchException("输入类型不匹配,请输入正确的数
字!");
}
} else if (!choose.equals("1") || !choose.equals("2")) {
throw new InputMismatchException("输入类型不匹配,请输入正确的数字!");
}
}
}
JDBCUtils 类代码如下:
public class JDBCUtils {
private static DataSource ds;
static {
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties
"));
//2.获取 DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
}
catch (Exception e){
ds = null;
}
大连东软信息学院
OOAD 大作业 3
}
private static Connection getConnection(){
Connection con;
try {
con = ds.getConnection();
}
catch (Exception ex){
con = null;
}
return con;
}
/* 获取 QueryRunner */
public static QueryRunner getQueryRunner(){
QueryRunner runner = new QueryRunner(ds);
return runner;
}
public static CallableStatement getStatement(String sql) throws Exception{
CallableStatement call = getConnection().prepareCall(sql);
return call;
}
}
3. 优化方案
(1)优化理由陈述
原有程序存在的问题一:
硬编码:原程序中直接使用了 new Scanner(System.in)和具体的类名(如
Login.loginInfo())来创建对象和调用方法,这导致了代码的硬编码。如果以
后需要修改或扩展这些对象或方法,就需要修改多处代码,增加了维护成本。
缺乏灵活性:原程序中的逻辑判断(如 if-else 语句)是固定的,不能灵活地
根据需求变化来扩展新的功能。如果需要添加新的菜单项或修改现有的菜单
项,就需要修改大量的代码。
代码复用性差:原程序中的代码复用性较差,每次需要执行类似的操作时(如
创建对象或调用方法),都需要重新编写代码。这导致了代码的冗余和重复。
不符合开闭原则:原程序在添加新功能时,往往需要修改已有的代码,这违
反了开闭原则。而使用工厂模式可以在不修改已有代码的情况下,通过扩展
新的工厂类来支持新的对象类型。采用工厂模式将对象的创建与使用分离,
降低了代码之间的耦合度。这使得代码更易于维护和扩展(具体改造的程序
类文件:CartMain.java)(见优化后类图 1)
原有程序存在的问题二:在静态代码块中直接加载配置文件和创建
DataSource 实例,这导致了代码的硬编码。如果配置文件路径或参数需要修