模板方法设计模式
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。
解决的问题:
当功能内部一部分实现是确定的,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。
换句话说,在软件开发中实现一个算法时,整体步骤是固定、通用的,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式。
例如:办理银行业务
步骤是固定的 — 模板 — 抽象类
1) 取号 — 不变 — 具体方法
2) 办理具体的业务 — 可变 — 抽象方法 — 不同子类根据自己具体的业务去实现
3) 反馈评分 — 不变 — 具体方法
案例
计算出指定程序的运行时间(从程序开始到结束的耗时)
分析:拿到当前时间,程序运行,拿到程序运行后的时间,返回时间差。
在这个过程中,拿到当前时间,拿到程序运行后的时间,返回时间差。这些步骤都是固定的,唯一易变的就是运行的程序。把运行的程序running();方法抽象化,那么子类在继承父类后,需要重写running();方法,那么需要运行的程序就确定了(需要运行什么程序只需要在抽象方法中定义就可以)。子类只需要重写被抽象的方法,就能达到目的。
class Test1
{
public static void main(String[] args){
/*
java.lang.System类有个静态方法:
static long | currentTimeMillis()
将当前时间以毫秒值返回
计算时间差:
在A时间点通过System类currentTimeMillis()拿到A时间点的毫秒值;
再在B时间点通过System类currentTimeMillis()拿到B时间点的毫秒值;
最后B时间点的毫秒值减去A时间点的毫秒值就是时间差。
*/
RuntimeA ra = new RuntimeA();
ra.showRunTime();
System.out.println("------------------------");
RuntimeB rb = new RuntimeB();
rb.showRunTime();
}
}
//模板类 --- 抽象类
abstract class RuntimeTemplate
{
//功能方法 --- 固定的步骤
public final void showRunTime(){
//1)程序运行开始时间
long start = System.currentTimeMillis();
//2)运行的程序
running();
//3)程序运行结束时间
long end = System.currentTimeMillis();
//4)计算耗时
System.out.println("程序耗时:"+(end-start)+"毫秒");
}
//该方法封装运行的程序 --- 可变的 ---- 抽象出来
public abstract void running();
}
//子类
class RuntimeA extends RuntimeTemplate
{
//重写程序运行的方法
public void running(){
int sum = 0;
for(int i=1;i<=1000;i++){
sum+=i;
}
}
}
class RuntimeB extends RuntimeTemplate
{
//重写程序的运行方法
public void running(){
int count = 0;
for(int i=1;i<=99999;i++){
if(i%2==0){
count++;
}
}
}
}
模板方法设计模式是一种常见的设计模式,它在抽象类中定义了一种算法骨架,允许子类在不改变整体结构的情况下重写算法的特定步骤。通过案例分析,如办理银行业务的固定步骤和运行程序的耗时计算,展示了模板方法如何用于处理确定与不确定的步骤,实现了代码的复用和扩展。
756

被折叠的 条评论
为什么被折叠?



