设计模式——模板方法
定义: 一个操作流程, 某些具体步骤留给子类实现, 使得子类可以在不改变操作流程的情况下重新定义某些特定步骤. 例如: 去银行需要拿号, 排队, 办理业务, 在这个场景下, 流程是固定的但是办理具体业务有所不同, 那么可以留给子类来实现, 其他的则可以由父类先实现好以后再定义一个办理业务类的抽象方法即可
结构:
- 抽象类: 负责给出一个执行流程. 通常由一个模板方法和若干个基本方法构成
- 模板方法: 定义了执行流程
- 基本方法:
- 抽象方法: 由具体子类实现, 例如: 办理业务
- 具体方法: 子类可以继承和重写, 例如: 拿号, 排队
- 钩子方法: 用于判断逻辑的方法和需要子类重写的空方法
- 具体子类: 实现抽象类中的抽象方法
实现
例: 炒菜 (倒油 -> 热油 -> 放菜 -> 放调味料 -> 翻炒) 中放菜和放调味料两个步骤因人而异, 而其他三个步骤则是固定的, 因此放菜和放调味料定义为两个抽象方法
AbstractClass
public abstract class AbstractClass {
public final void cook() {
pour();
heat();
pourFood();
pourSauce();
fry();
}
public void pour() {
System.out.println("倒油");
}
public void heat() {
System.out.println("热油");
}
public abstract void pourFood();
public abstract void pourSauce();
public void fry() {
System.out.println("翻炒");
}
}
Hamburger
public class Hamburger extends AbstractClass{
public void pourFood() {
System.out.println("放肉饼和芝士");
}
public void pourSauce() {
System.out.println("倒番茄酱");
}
}
Pizza
public class Pizza extends AbstractClass {
public void pourFood() {
System.out.println("放洋葱");
}
public void pourSauce() {
System.out.println("放盐");
}
}
Main
public class Main {
public static void main(String[] args) {
AbstractClass hamburger = new Hamburger();
AbstractClass pizza = new Pizza();
hamburger.cook();
pizza.cook();
}
}