Java面向对象模板方法(温习final、abstract)

版权声明:本文为博主(http://www.leologic.top/)原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17107171/article/details/81277281

 /*
 * 当代码完成优化后,就可以解决这类问题
 * 这种方式就是模板方法:
 *     在定义功能时,功能一部分是确定的,但有一部分是不确定的,而确定的部分在使用不确定的部分,
 * 那么这时就将不确定的部分暴露出去.由该类的子类去完成.
 */

1.封装前的代码(发现重复代码,//--//部分)

//创建一个记录代码运行时间的对象
class getTime
{
    public void getTime()
    {
    	//记录开始时间
        long start = System.currentTimeMillis();
        for(int x=0;x<1000;x++)
        {
            System.out.print(x);
        }
        //记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("毫秒"+(end-start));
    }
}
//-------------------------未加入封装思想时下面代码和上面代码存在重复---------------------------
//再写一个记录另一种时间的代码
class subTime extends getTime
{
    public void getTime()
    {
    	//记录开始时间
        long start = System.currentTimeMillis();
        for(int x=0;x<4000;x++)
        {
            System.out.println(x);
        }
        //记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("毫秒"+(end-start));
    }	
}
//----------------------------------------------------------------------------------
public class Test 
{
    public static void main(String[] args)
    {
//    	getTime gt = new getTime();
    	subTime gt = new subTime();
        gt.getTime();
    }
}

 2.封装后的代码(将重复代码独立出来,//**//部分)

           继承,重写时就只需要写独立出来的代码了(//--//部分包围的代码,对比1中的代码即可)

//创建一个记录代码运行时间的对象
class getTime
{
    public void getTime()
    {
    	//记录开始时间
        long start = System.currentTimeMillis();
        
        //**********************
        runCode();//子类复写后走的子类的方法
        //**********************
        
        //记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("毫秒"+(end-start));
    }
  //*****************************将重复的代码独立出来********************************
  	public void runCode() {
  		for(int x=0;x<1000;x++)
          {
              System.out.print(x);
          }
  	}

  //***************************************************************************
}

//-------------------------未加入封装思想时下面代码和上面代码存在重复---------------------------
//再写一个记录另一种时间的代码
class subTime extends getTime
{
	public void runCode() {
  		for(int x=0;x<1000;x++)
          {
              System.out.print(x);
          }
  	}
   
}
//----------------------------------------------------------------------------------
public class Test 
{
    public static void main(String[] args)
    {
//    	getTime gt = new getTime();
    	subTime gt = new subTime();//实力化子类对象
        gt.getTime();//在子类对象中调用父类getTime方法
    }
}

3.进一步抽象出一个类



/*
 * 当代码完成优化后,就可以解决这类问题
 * 这种方式就是模板方法:
 * 	在定义功能时,功能一部分是确定的,但有一部分是不确定的,而确定的部分在使用不确定的部分,
 * 那么这时就将不确定的部分暴露出去.由该类的子类去完成.
 */
//创建一个记录代码运行时间的对象
abstract class getTime
{
    public final void getTime()//通过final禁止复写
    {
    	//记录开始时间
        long start = System.currentTimeMillis();
        
        //**********************
        runCode();//子类复写后走的子类的方法,属于不确定功能
        //**********************
        
        //记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("毫秒"+(end-start));
    }
//*****************************将重复的代码独立出来********************************
  	public abstract void runCode();//这段代码留给子类去确定,做法交给父类,调用交给子类.可以将不确定功能暴露出去
//***************************************************************************
}

//-------------------------未加入封装思想时下面代码和上面代码存在重复---------------------------
//再写一个记录另一种时间的代码
class subTime extends getTime
{
	public void runCode() {
  		for(int x=0;x<1000;x++)
          {
              System.out.print(x);
          }
  	}
   
}
//----------------------------------------------------------------------------------
public class Test 
{
    public static void main(String[] args)
    {
//    	getTime gt = new getTime();
    	subTime gt = new subTime();//实力化子类对象
        gt.getTime();//在子类对象中调用父类getTime方法
    }
}

猜你喜欢

转载自blog.csdn.net/qq_17107171/article/details/81277281