Java中的模板模式

来源:互联网 发布:淘宝上卖的玉是真的吗 编辑:程序博客网 时间:2024/05/19 12:39

Java中的模板模式


模板模式概念

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

步骤


  1. 写先出解决该类事情的一个具体例子的解决方案(也就是将这个问题特殊化,提出一种解决方案,并写出相应的代码);
  2. 分析代码,把会发生变化的代码抽取出来独立成一个方法,把该方法描述成一个抽象的方法;
  3. 使用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中用的比较多的模板模式,为了避免重复代码的发生,这也是一种很好的方法

0 0
原创粉丝点击