9/16
软件设计 石家庄铁道大学信息学院
实验 24:模板方法模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解模板方法模式的动机,掌握该模式的结构;
2、能够利用模板方法模式解决实际问题。
[实验任务一]:数据库连接
对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操作模板类中我们定义了connDB()、openDB()、useDB()、closeDB()四个方法分别对应这四个步骤。对于不同类型的数据库(如SQL Server和Oracle),其操作步骤都一致,只是连接数据库connDB()方法不同,现使用模板方法模式对其进行设计。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
// 抽象类:数据库操作模板类
abstract class DatabaseOperation {
// 连接数据库
abstract void connDB();
// 打开数据库
void openDB() {
System.out.println("Opening database...");
}
// 使用数据库
void useDB() {
System.out.println("Using database...");
}
// 关闭数据库
void closeDB() {
System.out.println("Closing database...");
}
// 模板方法
final void templateMethod() {
connDB();
openDB();
useDB();
closeDB();
}
}
// 具体类:MySQL数据库操作
class MysqlDatabase extends DatabaseOperation {
void connDB() {
System.out.println("Connecting to MySQL database...");
}
}
// 具体类:SQL Server数据库操作
class SqlServerDatabase extends DatabaseOperation {
void connDB() {
System.out.println("Connecting to SQL Server database...");
}
}
// 具体类:Oracle数据库操作
class OracleDatabase extends DatabaseOperation {
void connDB() {
System.out.println("Connecting to Oracle database...");
}
}
// 客户端测试类
public class TemplateMethodPatternTest {
public static void main(String[] args) {
DatabaseOperation dbOperation;
dbOperation = new MysqlDatabase();
dbOperation.templateMethod();
dbOperation = new SqlServerDatabase();
dbOperation.templateMethod();
dbOperation = new OracleDatabase();
dbOperation.templateMethod();
}
}
// 连接数据库的具体方法
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
class MysqlDatabase extends DatabaseOperation {
private final String url = "jdbc:mysql://localhost:3306/yourDatabase";
private final String user = "yourUsername";
private final String password = "yourPassword";
@Override
void connDB() {
try {
// 加载MySQL JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 建立连接
System.out.println("Connecting to MySQL database...");
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
@Override
void closeDB() {
if (connection != null) {
try {
connection.close();
System.out.println("MySQL database connection closed.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
class SqlServerDatabase extends DatabaseOperation {
private final String url = "jdbc:sqlserver://localhost:1433;databaseName=yourDatabase";
private final String user = "yourUsername";
private final String password = "yourPassword";
@Override
void connDB() {
try {
// 加载SQL Server JDBC驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
// 建立连接
System.out.println("Connecting to SQL Server database...");
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
@Override
void closeDB() {
if (connection != null) {
try {
connection.close();
System.out.println("SQL Server database connection closed.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
class OracleDatabase extends DatabaseOperation {
private final String url = "jdbc:oracle:thin:@localhost:1521:yourSID";
private final String user = "yourUsername";
private final String password = "yourPassword";
@Override
void connDB() {
try {
// 加载Oracle JDBC驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 建立连接
System.out.println("Connecting to Oracle database...");
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
@Override
void closeDB() {
if (connection != null) {
try {
connection.close();
System.out.println("Oracle database connection closed.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3. 注意编程规范。

浙公网安备 33010602011771号