目标
- 学会用模式模式梳理使用工作中流程标准化的业务场景
- 通过学习适配模式,优雅地解决代码功能的兼容问题
- 了解 JDK源码和Spring源码中对模板模式的运用。
内容定位:
- 不太适合接触业务场景比较单一的学员
- 深刻了解模板模式和适配器模式的应用场景
模板模式通常有叫模板方法模式(Template Method Pattern) 是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤.
属于行为性设计模式
模板模式的适用场景
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复
在不改变流程的情况下,定制一些个性化的东西,使其结果不一样。
public abstract class NetworkCourse {
protected final void createCourse(){
// 1.发布预习资料
this.postPreResource();
// 2. 制作PPT
this.createPPT();
// 3. 在线直播
this.liveVideo();
// 4.提交课堂笔记,课件
this.postNote();
// 5. 提交源码
this.postSource();
// 6. 布置作业,有些课是没有作业的,有些课有作业的
// 如果有作业,检查作业; 如果没作业,完成了
if(needHomwWork()) {
checkHomeWork();
}
}
protected abstract void checkHomeWork();
// 钩子方法:实现流程微调
protected boolean needHomeWork(){return false};
final void postSource() {
System.out.println("提交源码");
}
final void postNote() {
System.out.println("提交课件和笔记");
}
final void liveVideo() {
System.out.println("在线直播");
}
final void postPreResource() {
System.out.println("分发预习资料");
}
final void createPPT() {
System.out.println("创建备课PPT");
}
}
public class JavaCourse extends NetworkCourse {
void checkHomework() {
System.out.println("检查java作业");
}
@Override
protected boolean needHomeWork(){return true}
}
// orm 映射定制化接口
public interface RowMapper {
T mapRow(ResultSet rs, int rowNum) throws Exception;
}
abstract class JdbcTemplate {
private DataSource dataSource;
public JdbcTemplate(DataSource dataSource) {
this.dataSource = dataSource;
}
public List<>> executeQuery(String sql ,RowMapper<?> rowMapper,Object[] values) {
try{
// 1. 获取连接
Connection conn = this.getConnection();
// 2. 创建语句集
PreparedStatement pstm = this.createPrepareStatement(conn,sql);
// 3. 执行语句集
Resultset rs = this.execute();
// 4. 处理结果集
List<?> result = this.parseResultSet(rs,rowMapper,values);
// 5.关闭结果集
// 6. 关闭语句集
// 7. 关闭连接
this.closeConnection(conn);
return result;
}catch(Exception e) {
e.printStackTrace();
}
}
public void closeConnection(Connection conn) throws Exception{
conn.close();
}
public PrepareStatement createPrepareStatement(Connection conn,String sql) {
return conn.prepareStatement(sql);
}
public Connection getConnection() throws SqlException {
return this.dataSource.getConnection();
}
}
MemberDAO extends JdbcTemplate {
}
JDK源码中关于模板模式的使用 AbstractList.get();
HttpServlet
mybatis:
Executor
BaseExecutor
ReuseExecutor SimpleExecutor BatchExecutor
模板模式的优点:
- 提高代码的复用性
- 提高代码的扩展性
- 符合开闭原则
缺点: - 类数目的增加
- 间接的增加了系统实现的复杂度
- 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍
欢迎加入技术交流群: