本文最后更新于 2025-03-23,文章超过7天没更新,应该是已完结了~

模板方法模式,又叫模板模式。在一个抽象类中公开定义了执行它的方法的模板,它的子类可以按需重写方法实现,但调用将以抽象类中模板的方式进行。

模板模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。

这种类型的设计模式属于行为型模式。

public abstract class SoyaMilk {
    //模板方法,声明为final,不让子类去覆盖改变算法
    final void make(){
        select();
        if (customerWantCondiments())
        addCondiments();
        soak();
        bead();
    }
    void select(){
        System.out.println("第一步,选择新鲜黄豆");
    }
    
    //想加什么料,由子类具体实现
    abstract void addCondiments();
    
    void soak(){
        System.out.println("第三步,黄豆和配料开始浸泡");
    }
    void bead(){
        System.out.println("第四步,黄豆和配料放到豆浆机去打");
    }
    //钩子方法,决定是否需要添加调料
    boolean customerWantCondiments(){
        return true;
    }
}

红豆+豆浆奶:

public class ReadBeanSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {
        System.out.println("加入红豆");
    }
}

纯豆浆:

public class PureSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {

    }

    @Override
    boolean customerWantCondiments() {
        return false;
    }
}

花生+豆浆:

public class PeanutSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {
        System.out.println("加入花生");
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        ReadBeanSoyaMilk readBeanSoyaMilk = new ReadBeanSoyaMilk();
        readBeanSoyaMilk.make();
        PeanutSoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.make();
        PureSoyaMilk pureSoyaMilk = new PureSoyaMilk();
        peanutSoyaMilk.make();
    }
}