设计模式目录:
模板模式是一种行为设计模式,它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现。模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分。
举一个例子帮助理解,假设提供一种造房子的算法。算法的步骤就是模拟造房子的过程:建地基、建支撑,最后添加墙和窗户 – 1. Fundation,2. Pillars,3. Walls,4. Windows。最重要的一点就是不能改变此建造过程,比如不可能在没用地基的时候就开始建造窗户。这个例子中,我们就创建了一个模板方法 – 将使用不同的方法完成对房子的建造。
为了确保子类不能重写(override)这个模板方法,应当使用final。
因为设计为一些方法的具体实现留待子类中,所以不得不安排基类为一个抽象类
HouseTemple.java
1 package cn.telling.test.action; 2 3 /** 4 * 5 * @ClassName: HouseTemplate TODO 6 * @author xingle 7 * @date 2015-9-24 下午2:04:22 8 */ 9 public abstract class HouseTemplate { 10 // template method, final so subclasses can‘t override 11 public final void buildHouse() { 12 buildFoundation(); 13 buildPillars(); 14 buildWalls(); 15 buildWindows(); 16 System.out.println("House is built."); 17 } 18 19 // default implementation 20 private void buildWindows() { 21 System.out.println("Building Glass Windows"); 22 } 23 24 // methods to be implemented by subclasses 25 public abstract void buildWalls(); 26 27 public abstract void buildPillars(); 28 29 private void buildFoundation() { 30 System.out.println("Building foundation with cement,iron rods and sand"); 31 } 32 33 }
buildHouse()是模板方法并定义了在建造房子过程中一系列方法的执行顺序。
WoodenHouse.java
1 package cn.telling.test.action; 2 3 /** 4 * 5 * @ClassName: WoodenHouse 6 * TODO 7 * @author xingle 8 * @date 2015-9-24 下午2:07:06 9 */ 10 public class WoodenHouse extends HouseTemplate{ 11 12 /** 13 * 14 * @Description: TODO 15 * @author xingle 16 * @data 2015-9-24 下午2:07:15 17 */ 18 @Override 19 public void buildWalls() { 20 System.out.println("Building Wooden Walls"); 21 22 } 23 24 /** 25 * 26 * @Description: TODO 27 * @author xingle 28 * @data 2015-9-24 下午2:07:15 29 */ 30 @Override 31 public void buildPillars() { 32 System.out.println("Building Pillars with Wood coating"); 33 } 34 35 }
此处也应当对其他方法进行重写,但是为了简便,此处没用完成。
GlassHouse.java
1 package cn.telling.test.action; 2 3 /** 4 * 5 * @ClassName: GlassHouse 6 * TODO 7 * @author xingle 8 * @date 2015-9-24 下午2:05:28 9 */ 10 public class GlassHouse extends HouseTemplate{ 11 12 /** 13 * 14 * @Description: TODO 15 * @author xingle 16 * @data 2015-9-24 下午2:05:39 17 */ 18 @Override 19 public void buildWalls() { 20 System.out.println("Building Glass Walls"); 21 } 22 23 /** 24 * 25 * @Description: TODO 26 * @author xingle 27 * @data 2015-9-24 下午2:05:39 28 */ 29 @Override 30 public void buildPillars() { 31 System.out.println("Building Pillars with glass coating"); 32 33 } 34 35 }
用一个测试程序来测试此处已完成的模板方法。
HouseClient.java
1 package cn.telling.test.action; 2 3 /** 4 * 5 * @ClassName: HousingClient TODO 6 * @author xingle 7 * @date 2015-9-24 下午2:06:33 8 */ 9 public class HousingClient { 10 public static void main(String[] args) { 11 12 HouseTemplate houseType = new WoodenHouse(); 13 14 // using template method 15 houseType.buildHouse(); 16 System.out.println("************"); 17 18 houseType = new GlassHouse(); 19 20 houseType.buildHouse(); 21 } 22 23 }
注意,client正在调用基类的模板方法并且依赖于不同步骤的实现细节,即这些正在使用的方法,他们一些来着基类另一些来自子类。上述程序的输出:


模板方法模式定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
这个模式是用来创建一个算法的模板。什么是模板?如你所见的,模板就是一个方法。更具体地说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现,这可以确保算法的结构保持不变,同时由子类提供部分实现。
参考:
原文:http://www.cnblogs.com/xingele0917/p/4835190.html