Java中的模板方法设计模式

模板方法是一种行为设计模式。模板方法设计模式用于创建方法的存根,并将部分实现步骤推迟到子类中。

模板方法设计模式

模板方法定义了执行算法的步骤,并且可以提供默认实现,这些实现对于所有或部分子类可能是通用的。让我们通过一个例子来理解这个模式,假设我们想提供一个建造房屋的算法。建造房屋需要执行的步骤包括 – 建造地基、建造柱子、建造墙壁和窗户。重要的是,我们不能改变执行的顺序,因为我们不能在建造地基之前建造窗户。因此,在这种情况下,我们可以创建一个模板方法,该方法将使用不同的方法来建造房屋。现在,对于所有类型的房屋来说,建造地基是相同的,无论是木屋还是玻璃屋。因此,我们可以为此提供基本实现,如果子类想要重写此方法,他们可以这样做,但大多数情况下,它对于所有类型的房屋都是通用的。为了确保子类不重写模板方法,我们应该将其设置为final。

模板方法抽象类

由于我们希望一些方法由子类来实现,所以我们必须将基类定义为抽象类。HouseTemplate.java

package com.Olivia.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())是一个模板方法,它定义了按顺序执行的多个步骤。

模板方法具体类

我们可以有不同类型的房子,例如木制房和玻璃房。WoodenHouse.java

package com.Olivia.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");
	}

}

我们也可以重写其他方法,但为了简便起见,我不打算这样做。GlassHouse.java

package com.Olivia.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");
	}

}

模板方法设计模式客户端

让我们用一个测试程序来测试我们的模板方法模式示例。HousingClient.java

package com.Olivia.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中的模板方法设计模式

  • All non-abstract methods of java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer.
  • All non-abstract methods of java.util.AbstractList, java.util.AbstractSet and java.util.AbstractMap.

模板方法设计模式的重要要点

    1. 模板方法应该由一系列固定顺序的步骤组成,对于一些方法来说,基类和子类的实现是不同的。模板方法应该是final的。

 

    1. 大多数情况下,子类调用超类的方法,但在模板模式中,超类的模板方法调用子类的方法,这被称为好莱坞原则——“不要打电话给我们,我们会打电话给你。”

 

    基类中具有默认实现的方法被称为钩子方法,它们可以被子类重写,如果你不希望某些方法被重写,可以将它们设为final,例如在我们的情况中,我们可以将buildFoundation()方法设为final,因为我们不想让子类重写它。

这就是关于Java中模板方法设计模式的全部内容,希望你喜欢。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds