模板方法(template method)模式是關於類的行為模式。在乙個抽象類中定義乙個演算法的骨架,其中一些步驟和邏輯已經實現,而將另外一部分步驟和邏輯推遲到子類中去實現。模板方法模式使得子類可以在不改變演算法結果的情況下,重新定義演算法中的某些步驟。模板方法模式讓不同的子類可以用不同的方式實現抽象的方法,從而讓演算法有不同的實現。
在具體實現上,模板方法模式主要包括了以下兩個類:
(1) 抽象類:定義了一系列的基本操作,這些操作一部分是具體的,另外一部分是抽象的,每個基本操作對應演算法的乙個步驟。另外,在抽象類中實現了乙個模板方法,用於定義演算法的框架,在該框架中不僅可以呼叫抽象類中實現的基本方法,也可以呼叫該類的子類實現的方法,還可以呼叫其他物件的方法
(2) 具體子類:抽象類的子類,實現了抽象父類中的抽象方法,以完成該子類特定演算法的步驟,也可以覆蓋在父類中已經實現的具體操作
在模板方法模式中,還有兩個重要的概念,即基本方法和模板方法:
(1) 基本方法:定義了演算法的每個步驟,其具體實現既可以在抽象父類中,也可以在具體子類中
(2) 模板方法:在抽象類中定義了演算法的框架,其是基本方法的組合,一般會被final修飾,表示其被具體子類修飾後不可以被重寫。模板方法也是模板方法模式名字的由來
為了更好的理解模板方法模式,這裡以現實生活中常見的去醫院看病的過程為例,對模板方法模式進行具體的闡述
首先定義乙個抽象父類,描述了去醫院看病的大致過程,其中,execute方法為上文提到的模板方法,定義了到醫院看病的基本流程,包括:1、排隊取號;2、具體的診斷過程;3、診斷結束,按照醫生的處方拿藥。其中第一步和第三步基本上都是相同的,因此在抽象父類中實現,而第二步根據病情的不同會有很大的不同,因此是抽象的,留到具體子類中去實現
abstract class sicknessdiagnosehandler
private void queueforseqnum()
public abstract void diagnose();
private void pickupmedicine()
}
有了抽象父類,需要定義繼承該抽象的具體子類,該子類中要複寫第二步,即上面的diagnose方法。例如,描述乙個看胃病的子類,在該子類的diagnose方法中,描述了診斷的具體過程,即做胃鏡檢查
class stomachachediagnosehandler extends sicknessdiagnosehandler
}
再比如,描述乙個診斷骨折的子類,在該子類的diagnose方法中,描述了拍x光片檢查的診斷過程
class bonefracturediagnosehandler extends sicknessdiagnosehandler
}
有了上面兩個類,編寫客戶端的測試程式就變得十分容易了
public class templatemethoddemo
}
模板方法模式的uml類圖描述比較簡單,只涉及到了簡單的繼承關係
模板方法模式是一種常見的設計模式,它是基於繼承的**復用基本技術,模板方法模式的結構和用法也是物件導向設計的核心之一。其主要針對這樣一種場景:當需要完成某件事的時候,其步驟是固定的,但是每個步驟的具體實現方式不一定。這時,我們可以將所有的操作抽象到乙個抽象類中,並且將固定的步驟定義在模板方法中,而具體的操作可以分成兩類,一類是實現方法比較固定的操作,這類操作在抽象類中實現,而另外一類是不固定的操作,這類操作被abstract修飾,表明其需要在子類中具體實現。
chapter9物件導向
1.繼承 單基繼承 多基繼承 先產生基類成員,在產生派生類成員 基類中含同名成員導致的二義性 處理辦法是採用成員名限定 菱形繼承 將共同基類宣告為虛基類 2.公有繼承,私有繼承,保護繼承 基類私有成員都不能被派生類或派生類物件訪問 public繼承 派生類能訪問基類的public protect,派...
chapter9 定義新型別
c 的型別分為 內部型別 自定義型別 c 的一種設計思想 應該讓程式設計師建立跟內部型別一樣易於使用的型別 乙個良好的程式設計習慣 標頭檔案中使用限定名 std 原始檔包含適當的using 類的成員函式 對於類的成員函式,總是有乙個隱含引數,就是正在由我們操作的物件 常量成員函式 示例struct ...
Chapter10 模板方法模式
模板方法模式,定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變乙個演算法的結構即重定義該演算法的某些特定步驟。父類可以成為子類的模板,所有重複的 都應該要上公升到父類去,而不是讓每個子類都去重複。當我們要完成某一細節層次一致的乙個過程或一系列步驟,但其個別步驟在更詳...