定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板类:
@Log4j2
public abstract class AbstractTemplate {
/**
* 相同的操作,不需要子类实现
*/
protected void sameOperation(){
operation1();
log.info("相同的操作");
operation2();
}
/**
* 不同的操作1,需要子类实现
*/
protected abstract void operation1();
/**
* 不同的操作1,需要子类实现
*/
protected abstract void operation2();
}
子类实现模板:
@Log4j2
class ConcreteTemplateA extends AbstractTemplate {
@Override
protected void operation1() {
log.info("具体模板A操作1");
}
@Override
protected void operation2() {
log.info("具体模板A操作2");
}
}
@Log4j2
class ConcreteTemplateB extends AbstractTemplate {
@Override
protected void operation1() {
log.info("具体模板B操作1");
}
@Override
protected void operation2() {
log.info("具体模板B操作2");
}
}
调用不同的子类:
AbstractTemplate concreteTemplateA = new ConcreteTemplateA();
concreteTemplateA.sameOperation();
AbstractTemplate concreteTemplateB = new ConcreteTemplateB();
concreteTemplateB.sameOperation();
结果:
16:37:36.968 [main] INFO com.learn.putc.designpatterns.behavior.template.ConcreteTemplateA - 具体模板A操作1
16:37:36.971 [main] INFO com.learn.putc.designpatterns.behavior.template.AbstractTemplate - 相同的操作
16:37:36.971 [main] INFO com.learn.putc.designpatterns.behavior.template.ConcreteTemplateA - 具体模板A操作2
16:37:36.971 [main] INFO com.learn.putc.designpatterns.behavior.template.ConcreteTemplateB - 具体模板B操作1
16:37:36.972 [main] INFO com.learn.putc.designpatterns.behavior.template.AbstractTemplate - 相同的操作
16:37:36.972 [main] INFO com.learn.putc.designpatterns.behavior.template.ConcreteTemplateB - 具体模板B操作2
模板方法适合结构相同,特定操作不同的场景使用,功能流程和相同的操作定义在父类,特定的操作定义在子类实现,这样去除了子类的重复代码,提高了代码的复用性