模板方法模式(Java版)

简介: 什么是模板方法模式?一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。模板方法使得子类可以不改变一个算法的结构,即可重定义该算法的某些特定步骤(通用代码在抽象类实现,其他步骤在子类实现)。接下来,将以我工作中用到的场景举例。

什么是模板方法模式?


一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。模板方法使得子类可以不改变一个算法的结构,即可重定义该算法的某些特定步骤(通用代码在抽象类实现,其他步骤在子类实现)。接下来,将以我工作中用到的场景举例。


背景


我们有一个模型训练平台,当我们训练模型的时候,需要预处理,先检测语料是否满足需要,如果满足发送模型训练消息到训练平台,生成训练任务ID返回。如果不满足要求,我们直接返回训练失败。


代码示例


网络异常,图片无法展示
|

1.定义任务执行接口

public interface BaseTrainService<K, V> {
  V execute(K vo);
}
复制代码

2.训练任务模板抽象类-实现通用模板

@Slf4j
public abstract class CommonTrainService<K, V> implements BaseTrainService<K, V> {
  // 预处理
  protected abstract boolean preHandle(K vo);
  // 核心处理流程
  protected abstract V handle(K vo);
  // 后处理
  protected abstract V postHandle(K vo, V dto);
  @Override
  public final V execute(K vo) {
    V dto = null;
    try {
      boolean flag = preHandle(vo);
      if (flag) {
        dto = handle(vo);
      }
      dto = postHandle(vo, dto);
    } catch (Exception e) {
      log.error("处理训练任务异常", e);
    }
    return dto;
  }
}
复制代码

3.训练任务

简单训练任务-不需要预处理,直接发送训练消息

@Slf4j
public class SimpleTrainService extends CommonTrainService<TrainVO, Response<TrainDTO>> {
  @Override
  protected boolean preHandle(TrainVO vo) {
    return true;
  }
  @Override
  protected Response<TrainDTO> handle(TrainVO vo) {
    TrainDTO result = new TrainDTO();
                ...
    return Response.success(result);
  }
  @Override
  protected Response<TrainDTO> postHandle(TrainVO vo, Response<TrainDTO> dto) {
    if (dto == null) {
      return Response.fail("创建训练任务失败");
    }
    return dto;
  }
}
复制代码

复杂训练任务-预处理判断是否发送训练消息

@Slf4j
public class ComplexTrainService extends CommonTrainService<TrainVO, Response<TrainDTO>> {
  @Override
  protected boolean preHandle(TrainVO vo) {
    List<TrainRecord> list = ....
    return CollectionUtils.isEmpty(list);
  }
  @Override
  protected Response<TrainDTO> handle(TrainVO vo) {
    TrainDTO result = new TrainDTO();
    ...
    return Response.success(result);
  }
  @Override
  protected Response<TrainDTO> postHandle(TrainVO vo, Response<TrainDTO> dto) {
    if (dto == null) {
      return Response.fail("创建训练任务失败");
    }
    return dto;
  }
}
复制代码

4. 客户端-调用具体类型训练任务

public class Client {
  public Response<TrainDTO> simpleTrainTask(TrainVO vo){
                ComplexTrainService service = new ComplexTrainService();
    return service.execute(vo);
  }
}
复制代码


总结


优点:

1、封装不变部分,扩展可变部分。

2、提取公共代码,便于维护。

3、行为由父类控制,子类实现。

缺点:

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:

1、有多个子类共有的方法,且逻辑相同。

2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:

为防止恶意操作,一般模板方法都加上 final 关键词。

相关文章
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
3月前
|
设计模式 算法 Java
【揭秘】如何巧妙运用Java模板方法模式,让你的代码优雅升级?
【8月更文挑战第30天】模板方法模式是一种行为型设计模式,它定义了算法的骨架并将某些步骤延迟到子类中,使子类能在不改变算法结构的情况下重定义特定步骤。此模式适用于具有共同结构但细节不同的场景,如角色升级系统。通过定义一个抽象类 `Character` 包含模板方法 `levelUp` 和抽象步骤方法,子类如 `Warrior` 和 `Mage` 可以实现具体逻辑。这种方式提供了良好的扩展性,确保算法结构不变,同时保持系统的稳定性和一致性,在数据处理和业务流程管理中广泛应用。
56 2
|
4月前
|
设计模式 算法 Java
Java面试题:描述Java中的模板方法模式及其作用?如何在Java中实现模板方法模式?
Java面试题:描述Java中的模板方法模式及其作用?如何在Java中实现模板方法模式?
43 0
|
6月前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
60 1
|
6月前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
6月前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
63 0
|
6月前
|
设计模式 算法 Java
Java设计模式——模板方法模式
Java设计模式——模板方法模式
|
设计模式 算法 Java
【设计模式——学习笔记】23种设计模式——模板方法模式Template Method(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——模板方法模式Template Method(原理讲解+应用场景介绍+案例介绍+Java代码实现)
56 0
|
设计模式 算法 Java
Java设计模式 ->模板方法模式
Java设计模式 ->模板方法模式
96 0
|
算法 Java
Java 模板方法模式
Java 模板方法模式
140 0
下一篇
无影云桌面