1. 程式人生 > >面向物件之一抽象類 抽象模板設計 (Servlet)就用到了模板設計

面向物件之一抽象類 抽象模板設計 (Servlet)就用到了模板設計

    
抽象類關鍵字  abstract 
抽象類不和那些關鍵字類共存  private  static  final  
抽象類 被子類繼承 如果子類不是抽象類  那麼強制子類必須覆寫父類的方法

抽象類 不能被final 所修飾  因為被final所修飾的類 無法繼承的

抽象類 之模板設計 (Template Method)

題目

/* 需求: 計算1000個整數和1000個字串相連線的耗時時間. */

所有的子類都具有一個共同的操作 為了程式碼複用 我把共有的程式碼寫成一個方法 提取到父類去 讓其他的子類所繼承於該父類 
但是 該共同操作方法中 有一部分功能是父類不知所措如何寫的  那麼就必須定義一個抽象方法  讓子類自己去實現自己想做的事情  而只在這個父類共性方法當中呼叫這個抽象方法即可--------->引出了一個模板設計

模板方法模式(TemplateMethod):在父類的一個方法中定義一個總體框架的骨架(模板方法),而將某一些步驟延遲到子類中,因為不同的子類實現細節不同。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

-------------------------------------------------------------------------------------------------------------

抽象父類負責定義操作中的業務骨架,而把某些具體的實現步驟延遲到子類中去實現。

模板方法  一種通用的處理方法 由模板去完成

抽象方法 一種業務功能的實現 由子類去實現

原始程式碼

class StringDemo{
    public void doWork(){
    //開始時間
    long start=System.currentTimeMillis();
    String str="";
    for (int i = 0; i < 10000; i++) {
str+=i;
}
    //結束時間
    long end=System.currentTimeMillis();
        System.out.println("總耗時間"+(end-start));
        System.out.println(str);
    }


}
class IntDemo{
public void doWork(){
//開始時間
long start=System.currentTimeMillis();
int j=0;
for (int i = 0; i < 10000; i++) {
j+=i;
}
//結束時間
long end=System.currentTimeMillis();
System.out.println("總耗時"+(end-start));
   System.out.println(j);
}

}


public class MyDemo7 {
public static void main(String[] args) {
/* 需求: 計算1000個整數和1000個字串相連線的耗時時間. */
System.out.println("int 耗時");
new IntDemo().doWork();
System.out.println("String 耗時");
new StringDemo().doWork();
}
}

模板程式碼如下 

abstract   class  MyDemo6{
//被final修飾方法是不能被覆寫的 
public final long getSuanfa(){
//開始時間記錄一下 因為這個2個子類都需要這個所以提供一個最終的方法 整體框架
long start =System.currentTimeMillis();
//這裡每個子類做不同的事情 那麼我就交給子類去實現
//而這個方法的具體實現交給子類去做
doWork();
//結束時間記錄一下
long end=System.currentTimeMillis();
return end-start;//返回所用的時間
}
//強制子類重寫我這個方法   而我不需要知道子類這個方法裡面做了哪些操作
public abstract void doWork();
 }


//那麼我把它們2個類共同的程式碼提起出來
class IntOperate extends MyDemo6 {
//這個子類繼承了父類 那麼必須重寫父類的抽象方法
public void doWork() {

long j = 0;
for (int i = 0; i < 10000; i++) {
            j+=i;
}
System.out.println(j);
}
}


class StringOperate extends MyDemo6{ 
//子類繼承於父類 那麼就強制重寫父類抽象方法
public void doWork() {

String str="";
for (int i = 1; i < 10000; i++) {
str+=i;
}
System.out.println(str+"sss");
}
}


public class OperateDemo {
/* 需求: 計算1000個整數和1000個字串相連線的耗時時間. */
     public static void main(String[] args) {
    //而我呼叫子類所繼承父類 最終方法 就行了
System.out.println(new StringOperate().getSuanfa());
System.out.println(new IntOperate().getSuanfa()); 
}
}