1. 程式人生 > >Java面向物件模板方法(溫習final、abstract)

Java面向物件模板方法(溫習final、abstract)

 /*
 * 當代碼完成優化後,就可以解決這類問題
 * 這種方式就是模板方法:
 *     在定義功能時,功能一部分是確定的,但有一部分是不確定的,而確定的部分在使用不確定的部分,
 * 那麼這時就將不確定的部分暴露出去.由該類的子類去完成.
 */

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方法
    }
}