面向物件之一抽象類 抽象模板設計 (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());
}
}