首页 > 代码库 > 设计模式7:模板方法模式

设计模式7:模板方法模式

有时候,我们需要定义某个方法,这个方法在高层次来看是相同的,但是里面几个具体步骤有可能有些不同。

一种实现方法是父类定义一个虚方法,由多个子类具体实现。但是这样做的话,不变的和可变的行为在子类中是混合在一起的,造成代码的大量重复。

这时候我们需要使用模板方法模式。

模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构,即可重定义算法的某些特定步骤。

这个模式通过将不变的行为搬移到父类,去除子类中的重复代码。

UML图:

在父类中,templateMethod是模板方法,需要调用primitiveMethod1和primitiveMethod2两个虚方法。

子类中对这两个虚方法给出了具体实现。

技术分享

代码:

AbstractClass及其子类:

public abstract class AbstractClass {
	
	public void templateMethod() {
		primitiveMethod1();
		primitiveMethod2();
		System.out.println("templateMethod");
	}

	protected abstract void primitiveMethod1();

	protected abstract void primitiveMethod2();
}

public class ConcreteClass1 extends AbstractClass {

	@Override
	protected void primitiveMethod1() {
		System.out.println("ConcreteClass1.primitiveMethod1");
	}

	@Override
	protected void primitiveMethod2() {
		System.out.println("ConcreteClass1.primitiveMethod2");
	}

}
public class ConcreteClass2 extends AbstractClass {

	@Override
	protected void primitiveMethod1() {
		System.out.println("ConcreteClass2.primitiveMethod1");
	}

	@Override
	protected void primitiveMethod2() {
		System.out.println("ConcreteClass2.primitiveMethod2");
	}

}

Demo:

public class TemplateDemo {
	
	public static void main(String[] args) {
		AbstractClass class1 = new ConcreteClass1();
		class1.templateMethod();
		AbstractClass class2 = new ConcreteClass2();
		class2.templateMethod();
	}
	
}

  

设计模式7:模板方法模式