一.模板方法模式介绍
模板方法模式中规定了完成一个任务的各个工序的执行顺序,同时对某些通用的基础工序提供了默认的实现。比如给定一个造房子的任务,完成这个任务的工序可以分解为打地基buildFoundation(),建柱子buildPillars(),建墙buildWalls(),装窗户buildWindows()四个工序,只要建房子都要打地基和安装窗户,所以我们可以在模板类中给buildFoundation()方法和buildWindows()方法提供一个默认实现,其他的工序留着建具体屋子的类来实现。
二.模板方法代码用例
下面以建房子为例用代码来说明模板方法模式
1.模板方法类HouseTemplate
模板方法类中的模板方法定义了工序的执行顺序,此外为了避免模板方法被覆盖,我们将模板方法用final修饰。
abstract class HouseTemplate { //template method, final so subclasses can't override public final void buildHouse(){ buildFoundation(); buildPillars(); buildWalls(); buildWindows(); System.out.println("House is built."); } //default implementation private void buildWindows() { System.out.println("Building Glass Windows"); } //methods to be implemented by subclasses public abstract void buildWalls(); public abstract void buildPillars(); private void buildFoundation() { System.out.println("Building foundation with cement,iron rods and sand"); } }
2.模板方法类的实例
下面来建造木房子(WoodenHouse)和玻璃房子(GlassHouse)
class WoodenHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println("Building Wooden Walls"); } @Override public void buildPillars() { System.out.println("Building Pillars with Wood coating"); } } class GlassHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println("Building Glass Walls"); } @Override public void buildPillars() { System.out.println("Building Pillars with glass coating"); } }
3.客户端使用模板方法
public class HousingClient { public static void main(String[] args) { HouseTemplate houseType = new WoodenHouse(); //using template method houseType.buildHouse(); System.out.println("************"); houseType = new GlassHouse(); houseType.buildHouse(); } }
输出结果:
Building foundation with cement,iron rods and sand Building Pillars with Wood coating Building Wooden Walls Building Glass Windows House is built. ************ Building foundation with cement,iron rods and sand Building Pillars with glass coating Building Glass Walls Building Glass Windows House is built.
三.模板方法的要点及使用
1.模板类中,模板方法要定义好固定的工序执行顺序,此外模板方法要用final修饰以避免被子类覆盖
2.模板方法中的方法调用的是子类的实现。
3.为了使某些提供的默认实现方法不被覆盖,同样可以用final修饰
在JDK中用到的模板方法:
java.io中InputStream,OutStream,Reader,Reader的非抽象方法。
java.util中AbstractSet,AbstractList,AbstractMap的非抽象方法。