设计模式第12篇:模板方法模式

一.模板方法模式介绍

  模板方法模式中规定了完成一个任务的各个工序的执行顺序,同时对某些通用的基础工序提供了默认的实现。比如给定一个造房子的任务,完成这个任务的工序可以分解为打地基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的非抽象方法。

                

 

posted @ 2019-01-11 15:53  曲项向天歌  阅读(141)  评论(0编辑  收藏  举报