🥑 模板方法

吞佛童子2022年6月20日
  • 设计模式
  • 行为型
  • 模板方法
大约 3 分钟

🥑 模板方法

1. 概述

1) 是什么

  • 定义一个操作中的算法骨架,然后将一些步骤延迟到子类中
  • 模板方法使得子类在不改变算法的结构即可重定义该算法的某些步骤
  • 模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑
  • 不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现
  • 先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现
  • 模版中可以有已经实现好的方法,还可以有钩子方法[protected],子类可以重写也可以不重写,还可以有抽象方法子类必须实现

2) 优点

  1. 提高代码的复用性,将相同部分的代码放到抽象类里
  2. 提高扩展性,增加一个新的不同实现时,只需要重写模板中的方法

3) 缺点


2. 代码示例

1) 场景 & 目标:

  • 设计一个 API 接口
  • 实现以下功能:
    • 参数解析
      • 将请求参数解析成 Java 实体类
    • 参数校验
      • 判断参数是否为空,范围是否合法
    • 具体业务处理
    • 封装返回参数
      • 将结果封装成 {code, message, data} 形式

2) 代码实现


3. 应用

1) AQS

  1. AQS 提供了 acquire() release()final 方法,不可重写
  2. 但是对外开放了 tryAcquire(int arg) tryRelease(int arg)protected 方法,
  3. 子类例如 ReentrantLock 等可以通过重写这些方法实现不同功能

2) AbstractApplicationContext

  1. AbstractApplicationContext 是个抽象类,里面的 refresh() 方法就是一个模板方法,定义了该方法有哪些流程

3) RedisTemplate

4) JdbcTemplate

public abstract class JdbcTemplate {  
     public final Object execute(String sql){  
        Connection con=null;  
        Statement stmt=null;  
        try{  
            con=getConnection();  
            stmt=con.createStatement();  
            Object retValue=executeWithStatement(stmt,sql);  
            return retValue;  
        }catchSQLException e){  
             ...  
        }finally{  
            closeStatement(stmt);  
            releaseConnection(con);  
        }  
    }   
    protected abstract Object executeWithStatement(Statement   stmt, String sql);  
}  
上次编辑于: 2022/6/20 下午8:24:47
贡献者: liuxianzhishou