在一个方法里定义算法的骨架,将一些步骤延迟到其子类,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式把我们不知道具体实现的步骤封装成抽象方法,提供一个按正确顺序调用它们的具体方法(这些具体方法统称为“模板方法”),这样构成一个抽象基类。子类通过继承这个抽象基类去实现各个步骤的抽象方法,而工作流程却由父类控制。
通俗的说就是,在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去。由该类的子类去完成。
毕姥爷视频里举了个做月饼的例子,我用代码实现了一下加深下对模板设计模式的理解。
1 //思路:水果馅和肉馅两种月饼加料还有加料的量,烘烤的火候是不确定,但是制作步骤是确定的,这时就将不确定的部分暴露出去。由该类的子类去完成。 2 abstract class MakeMoonCake 3 { 4 public abstract void addWater(); //加水 5 public abstract void addFlour(); //加面粉 6 public abstract void addStuffing(); //加填充物(馅) 7 public abstract void bakeTime(); //烘烤火候 8 public final void make() 9 { 10 addWater(); 11 addFlour(); 12 addStuffing(); 13 bakeTime(); 14 System.out.println("月饼已经做好了!"); 15 } 16 } 17 18 class FruitMoonCake extends MakeMoonCake{ 19 public void addWater(){ 20 System.out.println("加20ML的水"); 21 } 22 public void addFlour(){ 23 System.out.println("加40g面粉"); 24 } 25 public void addStuffing(){ 26 System.out.println("加水果片"); 27 } 28 public void bakeTime(){ 29 System.out.println("烘烤10分钟"); 30 } 31 } 32 33 class MeatMoonCake extends MakeMoonCake{ 34 public void addWater(){ 35 System.out.println("加30ML的水"); 36 } 37 public void addFlour(){ 38 System.out.println("加60g面粉"); 39 } 40 41 public void addStuffing(){ 42 System.out.println("加鲜肉"); 43 } 44 45 public void bakeTime(){ 46 System.out.println("烘烤20分钟"); 47 } 48 49 50 } 51 public class MoonCakeTemplate{ 52 public static void main(String args[]) 53 { 54 FruitMoonCake f=new FruitMoonCake(); 55 MeatMoonCake m=new MeatMoonCake(); 56 System.out.println("开始制作水果馅月饼吧!"); 57 f.make(); 58 System.out.println("-------------------"); 59 System.out.println("开始制作鲜肉馅月饼吧!"); 60 m.make(); 61 } 62 }