为之则易,不为则难。
一、模板方法模式简介
模板方法模式是设计模式中行为模式的一种。它提供了一种调用类中的方法的方式/模板。定义一个抽象类,类中定义一个模板方法,此方法以一定的方式调用类中的其它方法(一般为抽象方法,由子类实现)。子类按需提供方法的实现方式,而调用方式由模板方法决定。
模板方法模式的定义: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
PS:模板方法一般由 final 修饰,防止被恶意篡改。
二、代码示例
1、需求场景
建造房屋分为好多个步骤,不同的步骤由不同的方法实现,不同的房屋的每个步骤实现方式不同,所有的步骤按一定顺序执行。例如:打地基 => 砌墙 => 封顶。
2、类图设计
3、代码实现
BuildHouse: 建造房屋模板
/**
* 建造房屋模板
*
* @author ZhengNC
* @date 2020/8/18 19:52
*/
public abstract class BuildHouse {
/**
* 打地基
*/
public abstract void buildGround();
/**
* 砌墙
*/
public abstract void buildWall();
/**
* 封顶
*/
public abstract void buildRoof();
/**
* 建造房屋
*/
public final void build(){
buildGround();
buildWall();
buildRoof();
}
}
BuildEarthHouse: 建造土屋
/**
* 建造土屋
*
* @author ZhengNC
* @date 2020/8/18 20:08
*/
public class BuildEarthHouse extends BuildHouse {
@Override
public void buildGround() {
System.out.println("将土地压实");
}
@Override
public void buildWall() {
System.out.println("砌土墙");
}
@Override
public void buildRoof() {
System.out.println("用茅草封顶");
}
}
BuildStoneHouse: 建造石屋
/**
* 建造石屋
*
* @author ZhengNC
* @date 2020/8/18 20:18
*/
public class BuildStoneHouse extends BuildHouse {
@Override
public void buildGround() {
System.out.println("铺石板");
}
@Override
public void buildWall() {
System.out.println("垒石墙");
}
@Override
public void buildRoof() {
System.out.println("用石板封顶");
}
}
4、测试代码
/**
* 测试模板模式
*
* @author ZhengNC
* @date 2020/8/18 20:21
*/
public class TestTemplate {
public static void main(String[] args) {
System.out.println("---建石头房子---");
BuildHouse buildStoneHorse = new BuildStoneHouse();
buildStoneHorse.build();
System.out.println("---建土房子---");
BuildHouse buildEarthHouse = new BuildEarthHouse();
buildEarthHouse.build();
}
}
测试输出:
---建石头房子---
铺石板
垒石墙
用石板封顶
---建土房子---
将土地压实
砌土墙
用茅草封顶
三、模板方法模式和建造者模式的区别
- 模板方法是行为型模式的一种,注重于逻辑的实现;建造者模式是创建型模式的一种,注重于对象的创建。
- 模板方式是对某个算法的封装,算法的子步骤由子类去实现。建造者模式比模板方法模式多了一个指挥者类,建造者模式可以说是一个创建对象的固定算法。