Java中的模板模式
来源:互联网 发布:淘宝上卖的玉是真的吗 编辑:程序博客网 时间:2024/05/19 12:39
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中用的比较多的模板模式,为了避免重复代码的发生,这也是一种很好的方法
0 0
- Java中的模板模式
- java中的模板方法模式
- java中的策略模式与模板方法
- Java模板方法模式中的HookMethod实现
- Java模板方法模式中的HookMethod实现
- Mybatis中的模板模式
- java模板方法模式
- 模板方法模式 Java
- JAVA 模板方法模式
- Java 模板方法模式
- java模板模式
- java模板模式
- java--模板方法模式
- java模板模式
- java模板方法模式
- java模板方法模式
- JAVA-模板设计模式
- Java 模板模式
- 一次Full GC 过程的日志分析
- Swift之 ? 和 !
- 笔试题:马戏团(搜狐)
- Jquery 之DOM文档操作(一)
- 1000 Problem A
- Java中的模板模式
- 关于超长短信
- C#反射实例讲解
- 153. Find Minimum in Rotated Sorted Array
- IOS-应用之间调用
- Java并发编程:synchronized
- 283.move to zeros
- EIO框架测试Demo
- iOS中制作动态链接库Framework