标签: spring 设计模式
设计模式有很多,例如单例,动态代理,工厂等等;模板设计模式指的是将相应的模板方法提取出来再专门的一个位置定义,然后把相同通用过程的操作通过模板来实现。
一般有两种方式,jdbc的template是基于组合实现的
调用方法execute,会执行父类的模板和子类的方法;在模板方法中有一种函数叫钩子函数(例如这里的isLog),钩子函数的作用是让实现类可以通过一些方法来控制模板中的流程,多态得到MyJdbcTemplateByIn mt = new RoleDao();
然后mt.execute()即可,我们就可以把公共的操作在模板里面写,然后运行。
public abstract class MyJdbcTemplateByIn {
private void beginConnection() {
System.out.println("begin connection");
}
private void closeConnection() {
System.out.println("close connection");
}
public abstract void run();
/**
* 在模板方法中有一种函数叫做钩子函数,钩子函数的作用是让实现类可以通过一些方法来控制模板中的流程
* @return
*/
public abstract boolean isLog();
public void execute() {
beginConnection();
if(isLog()) {
System.out.println("加入了日志");
}
run();
closeConnection();
}
public class RoleDao extends MyJdbcTemplateByIn {
@Override
public void run() {
System.out.println("role add");
}
@Override
public boolean isLog() {
return true;
}
}
begin connection
加入了日志
role add
close connection
基于继承的实现主要问题在于只能实现一个方法,而要让模板实现多种方法,就需要用参数来传钩子函数;将所有要实现的方法都创建在模板中,然后在调用方法execute中直接传入一个钩子函数的接口Mycallback,然后在里面调用钩子函数doInTemplate。然后在需要实现的方法(如add)当中调用execute方法并自己实现钩子函数Mycallback,最后在roleDao.java中调用方法即可。
public interface MyCallback {
public void doInTemplate();
}
public class MyJdbcTemplate {
private void beginConnection() {
System.out.println("begin connection");
}
private void closeConnection() {
System.out.println("close connection");
}
/**
* 调用方法,传入一个钩子函数的接口
*/
public void execute(MyCallback call) {
beginConnection();
call.doInTemplate();//调用钩子函数
closeConnection();
}
/**
* 将所有要实现的方法都创建在模板中
*/
//内部类用常量,一次设置就完了。
public void add(final int id) {
//方法自己实现钩子函数
execute(new MyCallback() {
@Override
public void doInTemplate() {
System.out.println("add:" + id);
}
});
}
//删除方法
public void delete(final int id) {
execute(new MyCallback() {
@Override
public void doInTemplate() {
System.out.println("delete:" + id);
}
});
}
public class RoleDao {
private MyJdbcTemplate mt = new MyJdbcTemplate();
public void add(int id){
mt.add(id);
}
public void delete(int id) {
mt.delete(id);
}
}
begin connection
add:1
close connection
模板设计模式的应用情况有很多,其中主要在当一个程序需要执行大量重复操作的时候就可以考虑使用模板设计模式来实现,例如使用JDBC对数据库执行操作的时候,我们将开始连接,PreparedStatement执行sql语句,断开连接等方法写入模板之中,就可以在外部将sql语句和需要参数直接作为方法参数传入即可,简化代码。
例如:传入user和id即可。update方法会将sql语句和参数传入模板执行相应操作。
public void add(User user,int gid) {
jdbcTemplate.update("insert into t_user(username,password,nickname,gid) value (?,?,?,?)",
user.getUsername(),user.getPassword(),user.getNickname(),gid);
}