模版方法(Template Method)——类行为型模式

模版方法模式的意图:

定义一个操作中的算法的骨架,TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。即父类已经把算法的流程定义好了,子类只需要改变其中的某些步骤的实现。

就像我们要把东西放入冰箱中,需要的一套完整的流程即为; 打开冰箱,放入物品,关闭冰箱。其中打开和关闭都是固定的,而放入的物品则是不确定的,所以放入的物品需要我们在子类中来具体实现。实例化对象之后,去调用父类中的流程方法(TempleteMethod),就可以完成整个过程。这就是模版方法导致的一种反向控制结果,即让子类去找父类的方法。具体代码后面将会实现。

模版方法模式的结构图如下:

模版方法(Template Method)——类行为型模式_第1张图片

AbstractClass抽象类实现了一个模版方法,定义了一个算法的骨架,模版方法可以调用AbstractClass类中的方法,也可以调用其它类中的方法。

ConcreteClass实现父类操作中的某些特定子类相关的步骤。

模版方法模式的Java代码实现如下:

定义一个AbstractClass有模版方法和其它的模版固定方法,以及子类需要修改的抽象方法。

<pre name="code" class="java">package templatemethod;
/**
 * 以向冰箱里放东西为例
 */
public abstract class AbstractClass {
	//模版方法
	public void templeteMethod(){
		open();
		putObject();
		close();
	}
	//开冰箱
	public void open(){
		System.out.println("开冰箱...");
	}
	//放东西
	public abstract void putObject();
	//关冰箱
	public void close(){
		System.out.println("关冰箱...");
	}
}

 
 

 两个具体子类实现的抽象方法: 
 

package templatemethod;

public class ConcreteClassA extends AbstractClass{

	@Override
	public void putObject() {
		System.out.println("向冰箱里放入水果...");
	}
}
package templatemethod;

public class ConcreteClassB extends AbstractClass {

	@Override
	public void putObject() {
		System.out.println("向冰箱中放入蔬菜...");
	}
}
测试类:

package templatemethod;

public class TestMain {
	public static void main(String[] args) {
		AbstractClass a;
		//实例化ConcreteClassA()
		a = new ConcreteClassA();
		a.templeteMethod();
		//实例化ConcreteClassB
		a = new ConcreteClassB();
		a.templeteMethod();
	}
}
模版方法模式的适用性

1、一次性实现一个算法的不变的部分,并将可变的部分留给子类来实现。

2、各子类中公共的行为应该被提取出来并集中到一个公共父类中避免重复代码。

3、控制子类扩展。

总结:

模版方法模式是一种类行为模式,与对象无关。而且模版方法模式可以通过子类去找父类的方法。他可以减少很多重复性代码,所以在好多框架中模版方法的使用还是比较多的,最为经典的就是在Spring中的使用,希望大家可以去了解了解。

你可能感兴趣的:(模版方法(Template Method)——类行为型模式)