模板方法模式,又叫模板模式。在一个抽象类中公开定义了执行它的方法的模板,它的子类可以按需重写方法实现,但调用将以抽象类中模板的方式进行。
    模板模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。
    这种类型的设计模式属于行为型模式。

    1. public abstract class SoyaMilk {
    2. //模板方法,声明为final,不让子类去覆盖改变算法
    3. final void make(){
    4. select();
    5. if (customerWantCondiments())
    6. addCondiments();
    7. soak();
    8. bead();
    9. }
    10. void select(){
    11. System.out.println("第一步,选择新鲜黄豆");
    12. }
    13. //想加什么料,由子类具体实现
    14. abstract void addCondiments();
    15. void soak(){
    16. System.out.println("第三步,黄豆和配料开始浸泡");
    17. }
    18. void bead(){
    19. System.out.println("第四步,黄豆和配料放到豆浆机去打");
    20. }
    21. //钩子方法,决定是否需要添加调料
    22. boolean customerWantCondiments(){
    23. return true;
    24. }
    25. }

    红豆+豆浆奶:

    1. public class ReadBeanSoyaMilk extends SoyaMilk {
    2. @Override
    3. void addCondiments() {
    4. System.out.println("加入红豆");
    5. }
    6. }

    纯豆浆:

    1. public class PureSoyaMilk extends SoyaMilk {
    2. @Override
    3. void addCondiments() {
    4. }
    5. @Override
    6. boolean customerWantCondiments() {
    7. return false;
    8. }
    9. }

    花生+豆浆:

    1. public class PeanutSoyaMilk extends SoyaMilk {
    2. @Override
    3. void addCondiments() {
    4. System.out.println("加入花生");
    5. }
    6. }

    客户端:

    1. public class Client {
    2. public static void main(String[] args) {
    3. ReadBeanSoyaMilk readBeanSoyaMilk = new ReadBeanSoyaMilk();
    4. readBeanSoyaMilk.make();
    5. PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
    6. peanutSoyaMilk.make();
    7. PureSoyaMilk pureSoyaMilk = new PureSoyaMilk();
    8. peanutSoyaMilk.make();
    9. }
    10. }