20180329 java java面向对象-分析模板方法设计模式
模板方法设计模式定义:
在父类的一个方法中定义一个总体算法的骨架,而将某一些步骤延迟到子类中,因为不同的子类实现细节不同,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
抽象父类负责定义操作中的业务骨架,而把某些具体的实现步骤延迟到子类中去实现。
抽象父类至少提供的方法:
1)模板方法:一种通用的处理方法,即模板(总体算法的骨架);
2)抽象方法:一种具体的业务功能实现,由子类完成。
例如:
//操作的模板类
abstract class AbstractOperateTimeTemplate
{
//模板方法(具体的算法骨架)
final public long getTotaltime()//加final表示子类不能修改这个函数
//只能调用这个函数。
{
long begin = System.currentTimeMillis();//开始时间
this.doXX();//加this表示先找本类中的方法,找不到 再找子类中的doXX方法
long end = System.currentTimeMillis();//结束时间
long time = end - begin;//时间差
return time;
}
//具体操作,子类必须覆盖
protected abstract void doXX();
/*加protected是为了不让外界
调用该函数,只要子类调用该函数就行了
一般这种函数都用doXX格式,又叫钩子方法
*/
}
//String连接10000次
class StringOperate extends AbstractOperateTimeTemplate
{
public void doXX()
{
String str = "";
for(int i=0;i<10000;i++)
{
str += i;
}
}
}
//int累加100000次
class IntOperate extends AbstractOperateTimeTemplate
{
public void doXX()
{
int sum = 0;
for(int i=0;i<10000;i++)
{
sum += 1;
}
}
}
//模板方法设计模式
class TemplateMethodDemo
{
public static void main(String[] args)
{
//统计String连接1万次的时间差
System.out.println(new StringOperate().getTotaltime());//输出430
/*
解析:调用子类中的getTotaltime()方法,因为子类中没有,所以调用
父类中的getTotaltime()方法,而在 父类中的getTotaltime()方法又没有
doXX()方法的实现,所以又去子类中找doXX()方法的实现。
*/
//统计int累加1百万次的时间差
System.out.println(new IntOperate().getTotaltime());//输出4
}
}
有兴趣可以看这本书 :
阎宏:《JAVA与模式》
网上的 模板方法设计模式 地址:《JAVA与模式》之模板方法模式 - java_my_life - 博客园