我们结合上面的定义解释一下该图。
- AbstractClass便相当于上述作为抽象类的父类,ConcreteClass便是具体的实现子类。具体的应用中,可能存在一到多个实现子类。
- AbstractClass定义了一个public的templateMethod()模板方法以及作为步骤的method1()与method2()方法。
- AbstractClass#templateMethod()方法体调用method1()与method2()方法
public void templateMethod() {
...
this.method()1;
...
this.method()2;
...
}
- method1()与method2()方法为受保护的抽象方法(protected abstract)。实现子类ConcreteClass需要重载该方法。
Template Method模式的应用场景:
Template Method模式一般应用在具有以下条件的应用中:
- 具有统一的操作步骤或操作过程
- 具有不同的操作细节
- 存在多个具有同样操作步骤的应用场景,但某些具体的操作细节却各不相同
我们应该能够找到实现一件事情的相同的部分和不相同的部分各是什么:
举个简单的例子吧:比如说生产手机:生产的流程是相同的但是具体的细节可能有所不同(比如手机的颜色,手机的类别,手机的大小等等);
我们就用代码来实现这个小小的例子:
首先要创建一个抽象的模板类:
package TemplateDemo;
/**
* 这是一个抽象的模板类
* */
abstract class AbstractClass {
//定义一个模板方法来控制生产手机的流程
public void makeMobile(){//TemplateMethod
//首先生产手机体(模板方法自己完成)
System.out.println("生产了一个手机body");
this.makeDifferentFunction();
this.makeDifferentColor();
this.makeDifferentType();
System.out.println("一部手机制作完成");
//以上模板已经规定好了
}
//定义抽象的方法来完成不同的生产细节(不同功能的手机)
protected abstract void makeDifferentFunction();
//定义抽象的方法来完成不同的生产细节(不同颜色的手机)
protected abstract void makeDifferentColor();
//定义抽象的方法来完成不同的生产细节(不同类型的手机)
protected abstract void makeDifferentType();
}
/**
* 创建真是的实现类来实现具体的生产细节
* */
class ConcreteClass extends AbstractClass{
//实现父类中的抽象的方法
protected void makeDifferentColor() {
System.out.println("给该手机的颜色涂成蓝色");
}
protected void makeDifferentFunction() {
System.out.println("给该手机实现看MP4的功能");
}
protected void makeDifferentType() {
System.out.println("给该手机制作成翻盖的");
}
}
//写测试类
public class TestTemplate{
public static void main(String args[]){
AbstractClass ac = new ConcreteClass();//子类的对象付给父类
ac.makeMobile();//制作手机
//制作不同的手机只是修改子类就可以了
}
}
想要完成不同的实现细节的话就只是再写不同的子类就是了,模板已经规定好了实现的流程!
这样一个简单的模板方法模式的实例就完成了!