一.场景
某个系统或算法的需要执行的步骤且执行顺序也已经明确,但是某些步骤的具体实现还未确定。
二.模板方法模式
通过抽象类、抽象方法来明确各个步骤及其执行顺序,然后通过继承该抽象类来实现具体的步骤。
1.模板方法模式的结构
1.1 抽象类
负责定义算法的轮廓,可以包含几种类型的方法:
抽象方法:没有具体的实体,只是对某个步骤的声明;
具体方法:某个步骤的具体实现;
钩子方法:用于动态的控制算法各个步骤的执行;
1.2 具体子类
实现抽象类中所定义的抽象方法和钩子方法.
三、例子
1. 描述
这里尝试将模板方法应用在机器学习算法流程中,这个流程包括:数据探索(EDA)、数据清洗(clean)、特征工程(feature engineering)、模型训练(train)、模型评估(eval)。
2. 代码
2.1 抽象类
指定算法的执行步骤
MachineLearning.java
public abstract class MachineLearning {
protected boolean isClean = false; // 数据是否清洗完成
abstract void EDA(); // 数据探索,抽象方法
abstract void clean(); // 数据清洗,抽象方法
abstract boolean isClean(); // 钩子方法
abstract void featureEngineering(); // 特征工程,抽象方法
abstract void train(); // 模型训练, 抽象方法
abstract void eval(); // 模型评估,抽象方法
public void setIsClean(boolean isClean){
this.isClean = isClean;
}
public final void run(){
EDA();
if(!isClean())clean();
featureEngineering();
train();
eval();
}
}
2.2 具体类
实现了具体步骤Algorithm1.java
public class Algorithm1 extends MachineLearning{
Algorithm1(boolean isClean){
this.isClean = isClean;
}
public void setIsClean(boolean isClean){
this.isClean = isClean;
}
@Override
void EDA() {
System.out.println("算法1数据探索");
}
@Override
void clean() {
System.out.println("算法1数据清洗");
}
@Override
boolean isClean() {
return this.isClean;
}
@Override
void featureEngineering() {
System.out.println("算法1特征工程");
}
@Override
void train() {
System.out.println("算法1模型训练");
}
@Override
void eval() {
System.out.println("算法1模型评估");
}
}
2.3 模式的调用
Demo.java
public class Demo {
public static void main(String...args){
MachineLearning algo1 = new Algorithm1(true);
System.out.println("第一次执行算法");
algo1.run();
System.out.println("\n\n再一次执行算法");
algo1.setIsClean(false);
algo1.run();
}
}