模版方法(Template Method)模式:属于类的行为模式,它的用意是定义一个操作中的算法的骨架,将一些操作延迟到子类中。使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
模版方法模式的类图如下:
![](http://dl2.iteye.com/upload/attachment/0088/0472/fd09021f-2f1c-31ca-9352-5f045ded388b.png)
模版方法模式有两个角色:
1、
抽象模版(Abstract Template)角色:定义了一个或多个抽象操作,同时定义了一个模版方法,它是一个具体的方法,作为抽象模版的骨架。实际的逻辑在抽象操作中,推迟到子类实现。
2、
实现模版(Concrete Template)角色:实现了抽象模版中一个或多个抽象方法。
这里举个模拟计算器的例子来说模版方法模式,我们知道计算器计算的时候首先获取操作数1,然后获取操作数2,再进行加减乘除运算,最后显示在屏幕上,对于计算器来说不管是计算加减乘除那一种,都是要获取两个操作数,计算后再显示。可以建立以下类图模型:
![](http://dl2.iteye.com/upload/attachment/0088/0474/c7e9d03b-7556-3552-a266-5aed22dd2ad8.png)
- package templateMethod;
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:15:18
- *描述:抽象模版角色
- */
- public abstract class AbstractClass {
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:17:00
- *描述:模版方法
- */
- public final void templateMethod(){
- int m = getNum1();
- int n = getNum2();
- int s = operate(m ,n);
- show(s);
- }
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:21:49
- *描述:获取第一个操作数
- */
- private int getNum1(){
- return 8;
- }
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:21:49
- *描述:获取第二个操作数
- */
- private int getNum2(){
- return 2;
- }
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:19:53
- *描述:算法
- */
- public abstract int operate(int m,int n);
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:20:59
- *描述:显示
- */
- public void show(int s){
- System.out.println("结果是:"+ s);
- }
- }
- package templateMethod;
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:57:06
- *描述:加法
- */
- public class AddClass extends AbstractClass{
- @Override
- public int operate(int m,int n) {
- return m+n;
- }
- }
- package templateMethod;
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:57:24
- *描述:减法
- */
- public class SubClass extends AbstractClass{
- @Override
- public int operate(int m,int n) {
- return m-n;
- }
- }
- package templateMethod;
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:57:38
- *描述:乘法
- */
- public class MultiClass extends AbstractClass{
- @Override
- public int operate(int m,int n) {
- return m*n;
- }
- }
- package templateMethod;
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:57:50
- *描述:除法
- */
- public class DivClass extends AbstractClass{
- @Override
- public int operate(int m,int n) {
- return m/n;
- }
- }
- package templateMethod;
- /**
- *
- *作者:alaric
- *时间:2013-8-9下午8:14:34
- *描述:测试类
- */
- public class Client {
- /**
- *作者:alaric
- *时间:2013-8-9下午8:14:28
- *描述:
- */
- public static void main(String[] args) {
- //加
- AbstractClass c1 = new AddClass();
- c1.templateMethod();
- //减
- AbstractClass c4 = new SubClass();
- c4.templateMethod();
- //乘
- AbstractClass c2 = new MultiClass();
- c2.templateMethod();
- //除
- AbstractClass c3 = new DivClass();
- c3.templateMethod();
- }
- }
结果是:10
结果是:6
结果是:16
结果是:4
整个计算过程(取操作数,计算,显示)使用了模版方法模式,模版方法规定程序实现步骤,并且在子类中无法改变,而子类必须实现abstract修饰的抽象方法,不同的实现类可以有不同的实现,这也是模版方法模式的用意。如果你了解策略模式,你会发现在每条算法的封装上很像策略模式,而又不是策略模式,策略模式是利用委派的方法提供不同的算法行为,而模版方法是利用继承来提供不同的算法行为的。