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中用的比较多的模板模式,为了避免重复代码的发生,这也是一种很好的方法
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序