模版方法模式属于行为型模式。模版方法模式的意图是在一个方法里实现一个算法,并推迟定义算法中的某些步骤,从而让其他类重新定义他们。
一个例子
在项目中经常会用到RedisTemplate,restTemplate,JdbcTemplate之类的对象。因为在操作资源的时候,通常会涉及到打开连接,使用资源,关闭连接的过程。但是这几个步骤又是很通用的,所以开发者抽象出来一个模版来定义一个算法骨架,然后通过子类的方式来定义各种资源具体的操作。
抽象模版类
/**
* 数据源操作模版
* @author: xujian
* @Date: 2019-09-26
* @Description:
*/
public abstract class AbstractDataSourceTemplate {
/**
* 开启连接
*/
abstract void open();
/**
* 执行操作
*/
abstract void execute();
/**
* 关闭连接
*/
abstract void close();
/**
* 模版方法
*/
public final void run() {
open();
execute();
close();
}
}
Redis操作实现类
public class RedisDataSourceTemplate extends AbstractDataSourceTemplate {
/**
* 开启连接
*/
@Override
void open() {
System.out.println("开启redis连接...");
}
/**
* 执行操作
*/
@Override
void execute() {
System.out.println("操作redis...");
}
/**
* 关闭连接
*/
@Override
void close() {
System.out.println("关闭redis连接...");
}
}
Jdbc操作实现类
public class JdbcDataSourceTemplate extends AbstractDataSourceTemplate {
/**
* 开启连接
*/
@Override
void open() {
System.out.println("开启jdbc连接...");
}
/**
* 执行操作
*/
@Override
void execute() {
System.out.println("操作jdbc...");
}
/**
* 关闭连接
*/
@Override
void close() {
System.out.println("关闭jdbc连接...");
}
}
使用
//jdbc模版
AbstractDataSourceTemplate template = new JdbcDataSourceTemplate();
template.run();
System.out.println("----------------");
//redis模版
AbstractDataSourceTemplate template1 = new RedisDataSourceTemplate();
template1.run();
开启jdbc连接...
操作jdbc...
关闭jdbc连接...
----------------
开启redis连接...
操作redis...
关闭redis连接...
总结
- 封装不可变部分,扩展可变部分
- 提取公共代码,便于维护
- 行为由父类控制骨架/算法,子类实现
- 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象
- 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度
你可以在这里获取相关代码:设计模式-Template_Method模式