定义
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
使用场景
当一个操作有固定的几个步骤时,可以把步骤抽象出来定义的父类的抽象类中,而用子类去具体的实现每个步骤。
模板模式也常和其他模式联合使用,比如可以和责任链模式联合,责任链中的每个具体类可以是抽象模板类的具体实现。
类图
图片来自 https://www.cnblogs.com/qq-361807535/p/6854191.html
代码
抽象模板父类
/**
*
ClassName: AbstractTemplate <br/>
*
Function: 模板模式-抽象模板父类<br/>
*
* @author zhenxing.liu
* @date 2021/1/7
*/
public abstract class AbstractTemplate<T, S> {
/**
* final 可以防止被串改
*/
public final void process(T param, S result){
if(!checkParam(param)){
return;
}
this.processing(param, result);
this.afterProcess(result);
}
/**
* param check
*/
public abstract boolean checkParam(T param);
/**
* 处理中
*/
public abstract void processing(T param, S result);
/**
* 处理后做什么
*/
public abstract void afterProcess (S result);
}
具体实现的两个子类
public class ConcreteClassA extends AbstractTemplate<Request, Result>{
/**
* param check
*/
@Override
public boolean checkParam(Request param){
return true;
}
/**
* 处理中
*/
@Override
public void processing(Request param, Result result){
System.out.println("ConcreteClassA processing");
}
/**
* 处理后做什么
*/
@Override
public void afterProcess (Result result){
System.out.println("ConcreteClassA afterProcess");
}
}
public class ConcreteClassB extends AbstractTemplate<Request, Result>{
/**
* param check
*/
@Override
public boolean checkParam(Request param){
return true;
}
/**
* 处理中
*/
@Override
public void processing(Request param, Result result){
System.out.println("ConcreteClassB processing");
}
/**
* 处理后做什么
*/
@Override
public void afterProcess (Result result){
System.out.println("ConcreteClassB afterProcess");
}
}
/**
* 测试类
*/
public class TemplatePatternPractice {
public static void main(String[] args) {
Request request = new Request();
Result result = new Result();
AbstractTemplate templateA = new ConcreteClassA();
templateA.process(request, result);
AbstractTemplate templateB = new ConcreteClassB();
templateB.process(request, result);
}
}
运行结果
ConcreteClassA processing
ConcreteClassA afterProcess
ConcreteClassB processing
ConcreteClassB afterProcess