设计模式-模板方法(译)

214 阅读3分钟

介绍

模板方法是一种行为设计模式(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.

类图

template-method-pattern.png

模板方法设计模式在jdk中使用

  1. java.io包下的InputStream、OutputStream、Writer,Reader中的非抽象方法,是模板方法
  2. java.util包下的AbstractList、AbstractSet、AbstractMap中的非抽象方法,是模板方法

其它重点

  1. 模板方法中应特定的执行步骤,这些步骤的顺序是固定的,这些步骤的实现在基类和子类中都有差异,模板方法本身也应该被定义为 final
  2. 大多数时候,都是子类去调用基类的方法,但这模板方法设计模式中是相反的,这也是总所周知的IOC的原则
  3. 在父类中的默认实现,被称为钩子方法,他们可以被子类重写。如果不希望该步骤被重写,应该用final来修饰该方法

以上就是在java中的模板方法设计模式,希望大家喜欢

原文连接