首先来看看用来比较int和String分别进行1000次运算求需要的时间进行比较,代码的实现:
package com.test;import java.util.Scanner;
//String的连接1000次
class StringOperate{private String str;public long doWork(){long begin=System.currentTimeMillis();//开始时间setStr(null);for(int i=0;i<10000;i++){setStr(getStr() + i);}long end=System.currentTimeMillis();//结束时间long time=end-begin;//时间差return time;}public String getStr() {return str;}public void setStr(String str) {this.str = str;}
}
class IntOperate{private int num=0;public long doWork(){long begin=System.currentTimeMillis();for (int i = 0; i < 10000; i++) {setNum(getNum() + i);}long end=System.currentTimeMillis();long time=end=begin;return time;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}
}
//模板方法设计模式
class TemplateMethosDemo{}
public class Main{private static Scanner sc;public static void main(String[] args){//统计String连接10000次此时和int相加的时间差StringOperate st=new StringOperate();System.out.println(st.doWork());IntOperate in=new IntOperate();System.out.println(in.doWork());}
}
通过上述代码我们可以看出即使我们实现了上述的功能,但是代码不仅执行的效率低而且代码重复冗余,于是想到利用模板设计方法来实现:
package com.test;import java.util.Scanner;
//模板方法设计模式
abstract class AbstractOperateTimeTemplate{//模板方法:总体算法的骨架,子类不能修改算法的结构因此用finalfinal public long getTotalTime(){long begin=System.currentTimeMillis();//开始时间//具体操作(留给子类去完成),先调用子类中的再调用父类中的方法this.doWork();long end=System.currentTimeMillis();//结束时间long time=end-begin;return time;}//只能之类修改protected abstract void doWork();
}
//String的连接1000次
class StringOperate extends AbstractOperateTimeTemplate{public void doWork(){String str="";for(int i=0;i<10000;i++){str+=i;}}}
class IntOperate extends AbstractOperateTimeTemplate{public void doWork(){int num=0;for(int i=0;i<1000000;i++){num+=i;}}
}public class Main{public static void main(String[] args){//统计String连接10000次此时和int相加的时间差System.out.println(new StringOperate().getTotalTime());System.out.println(new IntOperate().getTotalTime());}
}
上述代码中doWork()也叫钩子函数(回调函数)。