什么是模版方法模式?
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的接口就可以重新定义该算法的某些特定步骤。
用法
- 某些类别的算法中,实做了相同的方法,造成程式码的重复。
- 控制子类别必须遵守的一些事项。
Spring Boot实现模板方法模式的简单案例
1. 定义抽象模板类
创建一个抽象类 AbstractTemplate,它定义了算法的框架,并包含一些抽象方法供子类实现。
public abstract class AbstractTemplate {
// 模板方法,定义了算法的框架
public final void templateMethod() {
step1();
step2();
step3();
}
// 具体步骤1,子类必须实现
protected abstract void step1();
// 具体步骤2,子类必须实现
protected abstract void step2();
// 具体步骤3,子类可以选择重写
protected void step3() {
System.out.println("AbstractTemplate: Default implementation of step3");
}
}
2. 创建具体子类
创建两个具体子类 ConcreteTemplateA 和 ConcreteTemplateB,它们分别实现了抽象类中的抽象方法。
@Component
public class ConcreteTemplateA extends AbstractTemplate {
@Override
protected void step1() {
System.out.println("ConcreteTemplateA: Step 1");
}
@Override
protected void step2() {
System.out.println("ConcreteTemplateA: Step 2");
}
@Override
protected void step3() {
System.out.println("ConcreteTemplateA: Custom implementation of step3");
}
}
@Component
public class ConcreteTemplateB extends AbstractTemplate {
@Override
protected void step1() {
System.out.println("ConcreteTemplateB: Step 1");
}
@Override
protected void step2() {
System.out.println("ConcreteTemplateB: Step 2");
}
}
3. 使用模板方法
在Spring Boot的Service或Controller中使用这些模板类。
@Service
public class TemplateService {
@Autowired
private ConcreteTemplateA concreteTemplateA;
@Autowired
private ConcreteTemplateB concreteTemplateB;
public void executeTemplates() {
System.out.println("Executing ConcreteTemplateA:");
concreteTemplateA.templateMethod();
System.out.println("\nExecuting ConcreteTemplateB:");
concreteTemplateB.templateMethod();
}
}
4. 创建Controller
创建一个简单的Controller来调用Service中的方法。
@RestController
@RequestMapping("/template")
public class TemplateController {
@Autowired
private TemplateService templateService;
@GetMapping("/execute")
public String executeTemplates() {
templateService.executeTemplates();
return "Templates executed!";
}
}
5. 运行项目
启动Spring Boot应用程序,并访问 http://localhost:8080/template/execute,你将看到以下输出
Executing ConcreteTemplateA:
ConcreteTemplateA: Step 1
ConcreteTemplateA: Step 2
ConcreteTemplateA: Custom implementation of step3
Executing ConcreteTemplateB:
ConcreteTemplateB: Step 1
ConcreteTemplateB: Step 2
AbstractTemplate: Default implementation of step3
6. 总结
在这个案例中,AbstractTemplate 类定义了算法的框架,而 ConcreteTemplateA 和 ConcreteTemplateB 分别实现了具体的步骤。通过这种方式,模板方法设计模式允许你在不改变算法结构的情况下,灵活地重写算法的某些步骤。