项目经理:小王 马上到618了 你把xx促销活动写了。
开发小王:好的
一个月后 。。。
项目经理:小王 我们这边需要在加一个活动 你尽快写一下吧。
此时你的第一个促销活动已经写完了 你只能在重新写一遍下一个活动 那些重复的 冗余的代码还要重新写一遍。
这时候我们今天的主人公就来了 模板模式。
Demo-制作包子
编写一个制作包子的程序:
- 制作包子的流程 选材 > 和馅 > 上蒸笼
- 选择不同的食材,就可以做出不同口味的包子
- 制作出牛肉和猪肉的包子
制作包子【抽象类】
@Component
public abstract class BunAbstractService {
//制作包子 由实现类直接调用该方法即可
//加final修饰是为了防止被重写 也可以写一个接口由该类实现 重写接口方法
public final void make(){
chooseIngredients();
stir();
steamBun();
}
protected abstract void chooseIngredients();
private void stir(){
System.out.println("和馅");
}
private void steamBun(){
System.out.println("蒸包子");
}
}
具体的牛肉和猪肉 两个【子类】
@Service
public class BeefService extends BunAbstractService {
@Override
protected void chooseIngredients() {
System.out.println("选择的是牛肉");
}
}
@Service
public class PorkService extends BunAbstractService {
@Override
protected void chooseIngredients() {
System.out.println("选择的是猪肉");
}
}
具体调用方式
@RestController
public class BunController {
@Resource
private BeefService beefService;
@Resource
private PorkService porkService;
@GetMapping("/makeBeef")
public void makeBeef(){
beefService.make();
}
}
一个简易的小demo 主要是为了体现模板模式的复用和易扩展的两个特性。
它的主要原理就是定义一个算法的骨架,把不变的流程定义在算法中,把可变的部分交给子类,由子类来负责具体的实现。
代码很简单,但是掌握这种思想和把这种思想应用到线上就不是那么简单了。