從模板方法模式深入理解Java抽象類

2021-07-11 23:24:47 字數 2472 閱讀 6159

二話不說先上**,如下所示為乙個抽象類(抽象汽車模型)

與它的兩個具體實現類(寶馬模型、賓士模型)的模擬程式:

/*

* 抽象模板類,抽象汽車模型

*/public abstract class abstractcarmodel

//最重要的是,汽車要能行駛!而且行駛流程是固定的,不能改變!

protected final void run()

}

/*

* 具體實現類,寶馬汽車模型

*/public class bmwmodel extends abstractcarmodel

//實現汽車抽象模板類stop()方法,使寶馬能夠剎車

@override

protected void stop()

//寶馬汽車喇叭響聲就是「滴滴滴」,繼承父類alarm()方法即可

//所有汽車的行駛流程都是一致的,繼承父類run()方法

}

/*

*具體實現類,賓士汽車模型

*/public class benzmodel extends abstractcarmodel

//實現汽車抽象模板類stop()方法,使賓士能夠剎車

@override

protected void stop()

//賓士汽車喇叭響聲就是「巴拉巴拉巴拉」,需要重寫父類alarm()方法

@override

protected void alarm()

//所有汽車的行駛流程都是一致的,繼承父類run()方法

}

/*

* 實現場景類

*/public class client

}

執行結果:

由上述**我們可以總結出:1、我們說抽象類體現的是一種模板式的設計,它只有被具體實現類繼承並實現時才有意義。如上例中,abstractcarmodel類是乙個抽象類,它的例項是沒有意義的,它的具體實現類的例項才有意義。

2、我們知道,不合理使用類的繼承會破壞父類封裝性(子類可能篡改父類實現),所以抽象類的正確使用姿勢是:封裝不變部分,擴充套件可變部分。如上例中,run()方法是被abstractcarmodel抽象類用final關鍵字封裝好的,不允許篡改。而start()方法、stop()方法與alarm()方法都是可變的,子類去實現或者重寫,合理地實現了擴充套件。

3、這其實就是乙個簡單的模板方法模式的體現,我在阿里巴巴面試的時候被問到:用介面不能實現,非抽象類實現不可的應用場景?我這時候就該回答模板方法設計模式~~~~(>_

下面詳細介紹模板方法模式

模板方法模式的重點在於抽象模板類的方法型別,主要分三種:

1、抽象方法:由抽象類宣告,用abstract關鍵字標識,由具體實現類去實現。如上例所示的start()方法與stop()方法。

2、具體方法:由抽象類宣告並實現,用final關鍵字標識,在具體實現類中只能呼叫。如上例所示的run()方法。

3、鉤子方法:由抽象類宣告並實現,具體實現類可以繼承抽象父類的預設實現,也可以根據具體情況進行修改擴充套件。如上例所示的alarm()方法,bmwmodle類就是繼承了abstractcarmodel抽象類alarm()方法的預設實現;而benzmodel類就是重寫了alarm()方法。

httpservlet中的鉤子方法

鉤子方法經常是乙個空的實現,因為乙個實現類並不需要全部的方法,比如httpservlet類中的dopost()、doget()、doput()、dodelete()、dohead()……為處理http請求,每一種http方法對應著乙個do方法,這也是鉤子方法預設的命名規則。這些方法在httpservlet抽象類中都是以空實現的鉤子方法存在的。在具體實現的時候,一般乙個servlet只需要處理某幾個http方法,在具體的servlet中就重寫對應的幾個do方法就可以了。

鉤子方法和具體方法的存在使抽象類與介面具有了最主要的差異:

介面主要體現的是一種規範,實現介面的類只能去實現這種規範,但使用者通過與統一介面對接實現了規範與實現的分離,極大地降低了模組間的耦合度;

而通過模板方法模式使用抽象類,可以繼承某些具體方法,實現了規範並增加了**的可重用性,而繼承抽象方法與鉤子方法使實現類可以靈活地擴充套件抽象模板類,介面並不能有這樣的靈活擴充套件特性,是非常常用而有意義的一種設計模式!

常用設計模式 深入理解模板模式

定義 定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。說到步驟,我想對於我們程式設計師來說,最熟悉的當然是乙個需求的乙個開發流程了,下面我們就從開發流程來了解模板模式。那麼開發流程具體有哪些步驟,請看 1.需求評審 產品,開...

深入理解模板1

1,模版引數可以有三種型別 1 型別 2 編譯時常量 3 其他模版.2,型別 include include using namespace std template class stack int main 3,編譯時常量 include include using namespace std t...

(基礎)深入理解java的方法

邏輯 資料 功能 方法 函式 處理資料的邏輯,一段 核心在於處理資料的邏輯!資料分類與存放的位置 區域性變數 方法內部定義的變數,包括形參 存放在棧記憶體中 成員變數 類中定義的變數 存放在堆記憶體中對應物件的區域中 類變數 類中被static修飾的變數 存放在方法區的靜態區中 方法的功能體現,正是...