搞懂钩子方法和模板方法,看完这篇就够了

搞懂钩子方法和模板方法,看完这篇就够了,第1张

public abstract class AbastractCourse {

public final void createCourse(){

//1.发布预习资料

postPreResoucse();

//2.制作课件PPT

createPPT();

//3.在线直播

liveVideo();

//4.上传课后资料

postResource();

//5.布置作业

postHomework();

if(needCheckHomework()){

checkHomework();

}

}

protected abstract void checkHomework();

//钩子方法

protected boolean needCheckHomework(){return false;}

protected void postHomework(){

System.out.println(“布置作业”);

}

protected void postResource(){

System.out.println(“上传课后资料”);

}

protected void liveVideo(){

System.out.println(“直播授课”);

}

protected void createPPT(){

System.out.println(“制作课件”);

}

protected void postPreResoucse(){

System.out.println(“发布预习资料”);

}

}

上面代码中有个钩子方法,可能有些小伙伴不是太理解,在此笔者稍做解释。设计钩子方法的主要目的是干预执行流程,使得控制行为流程更加灵活,更符合实际业务的需求。钩子方法的返回值一般为适合条件分支语句的返回值(如boolean、int等)。小伙伴们可以根据自己的业务场景决定是否需要使用钩子方法。

然后创建JavaCourse类。

public class JavaCourse extends AbastractCourse {

private boolean needCheckHomework = false;

public void setNeedCheckHomework(boolean needCheckHomework) {

this.needCheckHomework = needCheckHomework;

}

@Override

protected boolean needCheckHomework() {

return this.needCheckHomework;

}

protected void checkHomework() {

System.out.println(“检查Java作业”);

}

}

创建PythonCourse类。

public class PythonCourse extends AbastractCourse {

protected void checkHomework() {

System.out.println(“检查Python作业”);

}

}

最后编写客户端测试代码。

public static void main(String[] args) {

System.out.println(“=架构师课程=”);

JavaCourse java = new JavaCourse();

java.setNeedCheckHomework(false);

java.createCourse();

System.out.println(“=Python课程=”);

PythonCourse python = new PythonCourse();

python.createCourse();

}

通过这样一个案例,相信小伙伴们对模板方法模式有了一个基本的印象。为了加深理解,我们结合一个常见的业务场景进行介绍。

[](()2 使用模板方法模式重构JDBC业务 *** 作


创建一个模板类JdbcTemplate,封装所有的JDBC *** 作。以查询为例,每次查询的表都不同,返回的数据结构也就都不一样。我们针对不同的数据,都要封装成不同的实体对象。而每个实体封装的逻辑都是不一样的,但封装前和封装后的处理流程是不变的,因此,可以使用模板方法模式设计这样的业务场景。首先创建约束ORM逻辑的接口RowMapper。

/**

  • ORM映射定制化的接口

  • Created by Tom.

*/

public interface RowMapper {

T mapRow(ResultSet rs,int rowNum) throws Exception;

}

然后创建封装了所有处理流程的抽象类JdbcTemplate。

public abstract class JdbcTemplate {

private DataSource dataSource;

public JdbcTemplate(DataSource dataSource) {

this.dataSource = dataSource;

}

public final 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.executeQuery(pstm,values);

//4.处理结果集

List result = this.parseResultSet(rs,rowMapper);

//5.关闭结果集

rs.close();

//6.关闭语句集

pstm.close();

//7.关闭连接

conn.close();

return result;

}catch (Exception e){

e.printStackTrace();

}

return null;

}

private List parseResultSet(ResultSet rs, RowMapper rowMapper) throws Exception {

List result = new ArrayList();

int rowNum = 0;

while (rs.next()){

result.add(rowMapper.mapRow(rs,rowNum++));

}

return result;

}

private ResultSet executeQuery(PreparedStatement pstm, Object[] values) throws SQLException {

for (int i = 0; i < values.length; i++) {

pstm.setObject(i,values[i]);

}

return pstm.executeQuery();

}

private PreparedStatement createPrepareStatement(Connection conn, String sql) throws SQLException {

retur 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 n conn.prepareStatement(sql);

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/798093.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存