模板方法模式,又叫模板模式。在一个抽象类中公开定义了执行它的方法的模板,它的子类可以按需重写方法实现,但调用将以抽象类中模板的方式进行。
模板模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。
这种类型的设计模式属于行为型模式。
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 {@Overridevoid addCondiments() {System.out.println("加入红豆");}}
纯豆浆:
public class PureSoyaMilk extends SoyaMilk {@Overridevoid addCondiments() {}@Overrideboolean customerWantCondiments() {return false;}}
花生+豆浆:
public class PeanutSoyaMilk extends SoyaMilk {@Overridevoid 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();}}
