概述
创建一个抽象类,作为模板类,其中包含定义算法框架的方法,通常称为模板方法。这个方法在模板类中被声明为final,以防止子类重写整个算法框架。
在模板类中定义一些抽象方法,表示某些特定步骤的具体实现需要由子类来完成。
在模板类中实现通用的步骤,这些步骤在算法中是固定的,不会因为具体实现的不同而改变。这些步骤可以是具体的方法或者空方法。
子类继承模板类,并实现模板类中的抽象方法,完成特定步骤的具体实现。
可以总结为:
* 1-封装不变的部分,扩展可变的部分 * 2-提取公共代码,便于维护 * 3-优化代码结结构,该抽象的抽象,该复用的复用 * 4-一套模版到处使用
此处用制作饮料作为示例来编写代码,制作饮料 分为准备水,准备调料咖啡粉,酸梅粉,橘子汁等等搅拌,然后制作完成
1-定义模版类
public abstract class DrinkBuildService {
//准备水
protected abstract String water(String args);
//放入材料(咖啡 / 酸梅粉 / 橙汁)
protected abstract String making(String args);
//完成
protected abstract String complete(String args);
/**
* <简述>模版方法
* <详细描述>
* @author syf
* @date 2023/8/23 11:02
* @param args
* @return java.lang.String
*/
final public String start(String args){
//第一步 准备水
String water = water(args);
System.out.println(water);
//放入调料、材料、搅拌
String making = making(water);
System.out.println(making);
//完成
String complete = complete(making);
return complete;
}
}
2-子类继承模版类
定义咖啡实现类实现接口
public class CoffeeBuildServiceImpl extends DrinkBuildService {
@Override
protected String water(String args) {
return args + "水已经放入杯具";
}
@Override
protected String making(String args) {
return "搅拌完成";
}
@Override
protected String complete(String args) {
return "制作完成";
}
}
定义橙汁实现类实现接口
public class OrangeBuildServiceImpl extends DrinkBuildService {
@Override
protected String water(String args) {
return args + "水已经放入杯具";
}
@Override
protected String making(String args) {
return "搅拌完成";
}
@Override
protected String complete(String args) {
return "制作完成";
}
}
3-结果展示
@org.junit.jupiter.api.Test
void contextLoads2() {
//制作咖啡
CoffeeBuildServiceImpl coffeeBuildService = new CoffeeBuildServiceImpl();
String coffee = coffeeBuildService.start("咖啡");
System.out.println(coffee);
//制作橙汁
System.out.println("------------------------");
OrangeBuildServiceImpl orangeBuildService = new OrangeBuildServiceImpl();
String orange = orangeBuildService.start("橙汁");
System.out.println(orange);
}
咖啡水已经放入杯具
搅拌完成
制作完成
------------------------
橙汁水已经放入杯具
搅拌完成
制作完成