模板方法模式定义为:
在一个方法中定义了一个算法的骨架或者步骤,而将一些步骤延迟到子类中去实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某一些步骤。
模板方法在基类中定义了一个操作的流程顺序,能够保证该步骤按序进行,有一些步骤的具体实现在基类中已经声明,而将一些变化的步骤的具体实现交给了子类去实现,从而就达到了延迟一些步骤到子类中,模板方法一个最大的好处就是能够设定一个业务流程能够按照一定严格的顺序执行,控制了整个算法的执行步骤。
这个方法将算法定义成一组步骤,其中凡是想让子类进行自定义实现的步骤,均定义为抽象方法。抽象基类的特点是,一般将模板方法设置为final,这样防止子类覆盖该算法的步骤,将一些相同的操作或步骤直接在基类中实现,将一些变化的步骤设置为抽象由子类去完成。
Java实现示例
类图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 业务流程模板,提供基本框架 */ public abstract class BaseTemplate { public abstract void part1(); public abstract void part2(); public abstract void part3(); //这里为了严格实验结果,使用final不可被重写 public final void useTemplateMethod() { part1(); part2(); part3(); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/** * 模板实现方式1 */ public class TemplateMethod extends BaseTemplate { @Override public void part1() { System.out.println( "模板方法1" ); } @Override public void part2() { System.out.println( "模板方法2" ); } @Override public void part3() { System.out.println( "模板方法3" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/** * 模板实现方式2 * @author stone * */ public class TemplateMethod2 extends BaseTemplate { @Override public void part1() { System.out.println( "模板方法11" ); } @Override public void part2() { System.out.println( "模板方法22" ); } @Override public void part3() { System.out.println( "模板方法33" ); } } |
1
2
3
4
5
6
7
8
9
10
11
|
public class Test { public static void main(String[] args) { BaseTemplate tm = new TemplateMethod(); tm.useTemplateMethod(); System.out.println( "" ); BaseTemplate tm2 = new TemplateMethod2(); tm2.useTemplateMethod(); } } |
打印:
1
2
3
4
5
6
7
|
模板方法1 模板方法2 模板方法3 模板方法11 模板方法22 模板方法33 |