您的位置:首页 > 编程语言 > Java开发

Java中的模板模式

2016-03-14 17:45 465 查看

Java中的模板模式

模板模式概念

在Java中某类事情的步骤有些是固定的,有些是会发生变化的,那么这时候我们就可以为这类事情提供一个模板代码,从而提高效率。

步骤

写先出解决该类事情的一个具体例子的解决方案(也就是将这个问题特殊化,提出一种解决方案,并写出相应的代码);

分析代码,把会发生变化的代码抽取出来独立成一个方法,把该方法描述成一个抽象的方法;

使用final修饰模板方法,防止别人重写模板方法。

实例

下面我将通过一个实例去解读上面的过程,首先我提出一种需求,计算程序的运行时间,分析这个过程,首先,获取程序执行之前的时间,接着运行程序,程序运行完成之后,记录运行结束的时间,然后两个时间相减便得到的改程序的运行时间,现在我首先实现一个实例,测试一个循环的执行时间。代码如下:

1.利用一个具体的实例,写出了整个代码,

public class MyTemplate{
public void getTime(){
long startTime = System.currentTimeMillis();//记录程序的开始时间,不随具体的程序而改变
for(int i = 0 ; i < 100 ; i++){
System.out.println("Hello,World!");
}   //这段代码会随着计算的不同而发生改变
long endTime = System.currentTimeMillils();//记录程序的结束时间,固定不会改变
System.out.println("程序的执行时间是:"+(endTime-startTime));//固定不会改变
}
}

public class Test{
public static void main(String[] args){
Mytemplate time = new Mytemplate();
time.getTime();//调用方法获取程序执行时间
}
}


但是上述的代码存在问题,这并不是一个模板,首先,被计算时间的代码不能改变,我们应该让其能够改变,执行第二步,将发生改变的部分抽取成一个独立的方法,并将该方法使用abstract修饰,改进后的代码如下:

abstract public class MyTemplate{

public void getTime(){
long startTime = System.currentTimeMillis();//记录程序的开始时间,不随具体的程序而改变
getCode();
long endTime = System.currentTimeMillils();//记录程序的结束时间,固定不会改变
System.out.println("程序的执行时间是:"+(endTime-startTime));//固定不会改变
}

public abstract void getCode();  //抽象方法,需要继承才能使用
}

public class Test extends MyTemplate{
public void getCode(){
//请用户输入代码
}
public static void main(String[] args){
Test test = new Test();
test.getTime();
}
}


但是上述的代码还是存在问题,getTime方法可能会被继承修改,比如下面的代码:

abstract public class MyTemplate{

public void getTime(){
long startTime = System.currentTimeMillis();//记录程序的开始时间,不随具体的程序而改变
getCode();
long endTime = System.currentTimeMillils();//记录程序的结束时间,固定不会改变
System.out.println("程序的执行时间是:"+(endTime-startTime));//固定不会改变
}

public abstract void getCode();  //抽象方法,需要继承才能使用
}

public class Test extends MyTemplate{
public void getCode(){
//请用户输入代码
}
public void getTime(){
System.out.println("我重写了你的方法,让你再说自己做了模板");
}
public static void main(String[] args){
Test test = new Test();
test.getTime();
}
}


那么怎么解决这个问题呢?使用final关键字修饰我们的模板方法,看下面的代码:

abstract public class MyTemplate{

public final void getTime(){
long startTime = System.currentTimeMillis();//记录程序的开始时间,不随具体的程序而改变
getCode();
long endTime = System.currentTimeMillils();//记录程序的结束时间,固定不会改变
System.out.println("程序的执行时间是:"+(endTime-startTime));//固定不会改变
}

public abstract void getCode();  //抽象方法,需要继承才能使用
}

public class Test extends MyTemplate{
public void getCode(){
//请用户输入代码
}
/* 用final修饰不能重写(覆盖),JVM会报错
public void getTime(){
System.out.println("我重写了你的方法,让你再说自己做了模板");
}*/
public static void main(String[] args){
Test test = new Test();
test.getTime();
}
}


经过上述过程,终于真正的实现了一个可用的模板,用户在使用时只需继承我的类,然后实现那个抽象的方法便可以使用我封装好的方法。这就是在Java中用的比较多的模板模式,为了避免重复代码的发生,这也是一种很好的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息