一. 需求:统计不同操作的耗时时间模板操作
首先看这样一段代码:
class StringOperate
{
public Long stringOperate(){
Long currentTime = System.currentTimeMillis(); //当前系统的时间(毫秒)
String str = "";
for (int i=0 ; i<10000;i++ )
{
str +=i;
}
Long endTime = System.currentTimeMillis();
return endTime - currentTime;
}
}
class IntOperate
{
public Long intOperate(){
Long currentTime = System.currentTimeMillis(); //当前系统的时间(毫秒)
int num = 0;
for (int i=0 ; i<10000000;i++ )
{
num += i;
}
Long endTime = System.currentTimeMillis();
return endTime - currentTime;
}
}
class TemplateMethodDemo
{
public static void main(String[] args)
{
//统计String的10000次操作和int操作相加10000000次的时间差
System.out.println(new StringOperate().stringOperate());
System.out.println(new IntOperate().intOperate());
}
}
二.改进思路
三. 使用模板方法设计模式改进代码
// 抽象的模板类
abstract class TemplateMethod
{
//模板方法:总体算法的骨架,总体不能修改
final public Long typeOperate(){
Long currentTime = System.currentTimeMillis(); //当前系统的时间(毫秒)
// 具体操作留给子类完成
this.doWork();
Long endTime = System.currentTimeMillis();
return endTime - currentTime;
}
protected abstract void doWork();
}
class StringOperate extends TemplateMethod
{
public void doWork(){
String str = "";
for (int i=0 ; i<10000;i++ )
{
str += i;
}
}
}
class IntOperate extends TemplateMethod
{
public void doWork(){
int num = 0;
for (int i=0 ; i<10000000;i++ )
{
num += i;
}
}
}
class TemplateMethodDemo
{
public static void main(String[] args)
{
//统计String的10000次操作和int操作相加10000000次的时间差
System.out.println(new StringOperate().typeOperate());
System.out.println(new IntOperate().typeOperate());
}
}
四.模板方法设计模式
在父类的一个方法中定义一个总体算法的骨架(模板方法),而将某一些一些步骤延迟到子类中,因为不同的子类实现细节不同。模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤。
抽象父类负责定义操作中的业务骨架,而把某些具体的实现步骤延迟到子类中去实现。
在JavaWeb中:HttpServlet类中,也遵循这一命名规则,如doGet(),doPost()等方法。
抽象父类至少提供的方法:
- 模板方法:一种通用的处理方式,即模板(总体算法的骨架);
- 抽象方法:一种具体的业务功能实现,由子类完成;
注意:
抽象父类提供的模版方法只是定义了一个通用算法,其实现必须依赖子类的辅助。
模版方法作为模版样式不准子类覆写:
答:用final修饰,不让子类覆盖
抽象方法的权限又如何设置:
答:使用protected修饰