在一个多月的学习中,老师提到过很多设计模式,工厂设计模式,策略设计模式,模板设计模式,包装设
计模式......,今天说一下感触最深的模板设计模式。顾名思义,模板就是一个模型,只不过这个模型可
以根据你自己的需要实现不同的功能,我们也可以将一些固定的,使用频率较高的代码放在这个模型里,
什么意思呢?就是说如果我们用模板模式设计一个类的时候,就为这个类定义一个抽象方法,可以根据不
同的需要来实现这个抽象方法!
例如,在用JDBC时,连接数据库和的代码是千篇一律的,但是对数据库的操作却在经常变化,这个时候,
我们就可以用模板设计模式设计一个抽象类,其中包括两个方法!一个是连接数据库的execute()(即固
定的代码),所有这个抽象类的子类都可以用这个方法,节省了不少宝贵的时间,另一个是执行对数据库
操作的abstract doExecute(),为什么要定义成abstract呢?因为我们对数据库的操作是不固定的,有时
要查询,有时要更新,有时要插入,有了这个方法,就可以写一个类来继承这个抽象类,实现这个抽象方
法,然后根据需要来对数据进行筛选和更新,这也更符合面向对象的原理!
还是用程序来说明问题
1、定义一个抽象类
abstract class DbTemplate
{
Connection conn = null;
configurer config = null;
//用于实现不同功能的抽象方法
abstract void doExecuteQuery(Connection conn);
public void setConfig(configurer config)
{
this.config = config;
}
//实现相同功能的方法
public void execute()
{
BasicConfigurator.configure();
Log log = LogFactory.getLog(DbTemplate.class);
//读取属性文件中设定的关于连接数据库的属性值
String driver = config.getProperty("jdbc.driver");
String url = config.getProperty("jdbc.url");
String users = config.getProperty("jdbc.user");
String pass = config.getProperty("jdbc.password");
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
log.error("指定的Jdbc驱动程序找不到!");
}
try {
// 用得到的属性值获得连接
conn = DriverManager.getConnection(url,users,pass);
} catch (SQLException e) {
// TODO 自动生成 catch 块
log.error("连接数据库出错!");
}
}
}
2、一个继承了上述抽象类的类
public class AbstractDemo extends DbTemplate
{
//Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
//父类抽象方法的实现
void doExecuteQuery(String name,String pass)
{
// TODO 自动生成方法存根
execute();
BasicConfigurator.configure();
Log log = LogFactory.getLog(AbstractDemo.class);
try {
pstmt = conn.prepareStatement("select * from users where
name=? and pass=?");
} catch (SQLException e1) {
// TODO 自动生成 catch 块
log.error("请检查你的语句是否有错!");
}
try {
pstmt.setString(1,name);
} catch (SQLException e1) {
// TODO 自动生成 catch 块
log.error("请确认用户名是否有误!");
}
try {
pstmt.setString(2,pass);
} catch (SQLException e1) {
// TODO 自动生成 catch 块
log.error("请确认密码是否错误!");
}
try {
rs = pstmt.executeQuery();
} catch (SQLException e) {
// TODO 自动生成 catch 块
log.error("执行语句时出错!");
}
try {
if(rs.next())
{
log.info("欢迎登录!");
}
else
{
log.error("用户名或密码错误!");
}
} catch (SQLException e) {
// TODO 自动生成 catch 块
log.error("生成记录集时出错!");
}
}
上面这个程序是模拟用户登录时的用户名和密码校验的,我们还可以定写一些子类来继承上面的抽象类,
用来实现用户注册,用户名或密码的更改,以及用户查询等等功能,代码是一样的,你只需要根据情况调
整你的SQL语句。当然,我们只是为了说明模板设计模式的设计思想,程序还需要进一步完善。