介绍
模板方法是一种行为设计模式(behavioral design pattern),它用于在基类中创建模板方法,在子类中实现或者重写该模板方法中的一些具体实现
如果步骤的具体实现有多个子类公用,我们可以再基类中实现一个通用的步骤方法
让我们用创建房子的例子来说明,创建房子的基本步骤如下:
- 1.打地基
- 2.建柱子
- 3.砌墙
- 4.装窗户
我们不能改变上面三个步骤的顺序,例如先砌墙后打地基。所以我们可以用模板方法模式来创建不同类型的房子
建不同类型的房子,第一步都是打地基,不管木头房子,还是玻璃房子。这儿我们提供一个通用的打地基方法,如果需要不同的实现,可以在类中重写该方法
为了保证模板方法不被子类重写,我们应该使用final关键字修饰
基类
package com.journaldev.design.template;
public 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");
}
}
buildHouse() 就是一个模板方法,他定义几个步骤执行的顺序
子类
我们可以创建不同类型的房屋,比我木头房子和玻璃房子
package com.journaldev.design.template;
public 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");
}
}
package com.journaldev.design.template;
public 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");
}
}
也可以重写 buildWindows()、buildFoundation(),为了简单,这儿就免了
测试
我们写一个测试用例
package com.journaldev.design.template;
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.
类图
模板方法设计模式在jdk中使用
- java.io包下的InputStream、OutputStream、Writer,Reader中的非抽象方法,是模板方法
- java.util包下的AbstractList、AbstractSet、AbstractMap中的非抽象方法,是模板方法
其它重点
- 模板方法中应特定的执行步骤,这些步骤的顺序是固定的,这些步骤的实现在基类和子类中都有差异,模板方法本身也应该被定义为 final
- 大多数时候,都是子类去调用基类的方法,但这模板方法设计模式中是相反的,这也是总所周知的IOC的原则
- 在父类中的默认实现,被称为钩子方法,他们可以被子类重写。如果不希望该步骤被重写,应该用final来修饰该方法
以上就是在java中的模板方法设计模式,希望大家喜欢