定义:
在面向对象开发过程中,通常会遇到一些问题,比如我们知道一个算法所需要的关键步骤,并确定了这些步骤的执行顺序,但是,其中的某些步骤的具体实现是不可知的,或者说某些步骤是会随着环境的变化而变化,我们以一个小品中的故事为例,例如,把大象装冰箱,分三步:
第一步:把冰箱门打开
第二步:把大象放进去
第三步:把冰箱门关上
对于以上例子,分三步,顺序是固定的,但是如果让放进去的不是大象,而是老虎,狮子,山羊。。。。等等,怎么办?所以说顺序是固定的,但是中间某些步骤是会随着环境的变化而变化或者说子类可以重写其中的某些步骤的具体实现来达到不同的行为。
使用场景:
1 多个子类有公有的方法,并且逻辑基本相同时
2 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
3 重构时,模板模式是一个经常使用的模式,把相同的代码抽到到父类中,然后通过子类重写以达到不同的功能
还是以上面的把“某个东西”装进冰箱,来举例
代码示例如下:
1 /** 2 * 把大象放冰箱 3 */ 4 public abstract class EnterIceBox { 5 6 protected void openDoor(){ 7 System.out.println(" 1 打开冰箱门"); 8 } 9 10 protected void enterInfoIcobox(){ 11 System.out.println(" 2 把大象放冰箱"); 12 } 13 14 protected void closeDoor(){ 15 System.out.println(" 3 关闭冰箱门"); 16 } 17 18 protected final void start(){ 19 openDoor(); 20 enterInfoIcobox(); 21 closeDoor(); 22 } 23 }
上面是把大象放冰箱,如果我想把一只大公鸡放进冰箱呢?代码如下
1 //把公鸡放进冰箱 2 public class ChickenEnterIceBox extends EnterIceBox{ 3 @Override 4 protected void enterInfoIcobox() { 5 System.out.println("2 把小鸡放冰箱"); 6 } 7 }
1 /** 2 * 模板模式测试类 3 */ 4 public class TemplateTest { 5 public static void main(String[] args){ 6 test(); 7 } 8 9 public static void test(){ 10 EnterIceBox chickenEnterIceBox = new ChickenEnterIceBox(); 11 chickenEnterIceBox.start(); 12 13 } 14 15 }
模板模式在框架中用的比较多,比如android源码中的View的绘制,首先 measure,layout,draw
子类通过重写不同的方法,就可以自定义出不同的控件。以上的例子很简单,也是为了很好的说明问题
希望对大家有所帮助。
注:设计模式交流学习群 632945466 欢迎所有热爱技术的大牛,小菜,一起学习讨论进步提高,欢迎随时批评指正