模板方法模式說明
定義:定義方法操作的骨架,把一些具體實現延伸到子類中去,使用得具體實現不會影響到骨架的行為步驟!
說明:模式方法模式是一個繼承跟複用的典型模式,該模式定義了一個抽象類別,Abstract Class,其下定義了一個或多個模板方法,也就是頂級方法,這些方法定義行為的調度步驟,一般是調用抽象中定義的其他具體類或勾子;定義了一些抽象方 法,這些方法必須要由具體子類來實現;還有可能定義了一些勾子方法,這一般是空方法,用於子類擴充。
模板方法模式組成:
1>. 模板方法: 也叫骨架方法,定義行為調度步驟! 不能被子類修改,如果在java進階物件導向語言,一般會以 final 修飾!
2>. 抽象方法:待子類繼承必須實現的方法;
3>. 具體方法:用於在抽象類別中的頂級實現,一般也不能被覆蓋修改,一般也會加上 final 修飾!
4>. 勾子方法: 一般為空白方法. 方法命名一般以 “do” 開頭,類似於 HttpServlet 下的 doGet, doPost;
模板方法模式,一般用於 具有相同行為邏輯過程,但各自實現不太一樣的情境,這種情況就可以採用這種模式,定義骨架,規定如何去執行,順序、調度等,再讓子類各自去實具體的行為;
物件導向思想,要注意它不變跟變化的因素,在模板方法模式裡,行業邏輯是不變的,行為具體實現是可變的,把可變跟不可變的分離使之解藕,這符合物件導向的開閉原則;定義抽象骨架,讓具體實現以子類形式去自由擴充,互不影響。
模板模式結構圖:
執行個體情境:
1>. 比如不同檔案審批上呈過程,經過的人或部門是一樣的,但每個過程他的處理是不一致的;
2>. 再比如說,大學四年,不同專業每年所修的課本是不太一樣的;
執行個體源碼
這裡以讀大學四年來實現;
1. 定義抽象類別;
function AbstractClass() { }AbstractClass.prototype.template = function() { this.FirstYear(); this.SecondYear(); this.ThirdYear(); this.FourthYear();}AbstractClass.prototype.FirstYear = function() { console.log("需要重寫");}AbstractClass.prototype.SecondYear = function() { console.log("需要重寫");}AbstractClass.prototype.ThirdYear = function() { console.log("需要重寫");}AbstractClass.prototype.FourthYear = function() { console.log("需要重寫");}
2. 定義某學生;
function Student(name) { this.name = name;}Student.prototype = AbstractClass.prototype; //繼承Student.prototype.FirstYear = function() { console.log(this.name+" 第一年修: 語文" );}Student.prototype.SecondYear = function() { console.log(this.name+" 第二年修: 數學" );}Student.prototype.ThirdYear = function() { console.log(this.name+" 第三年修: 英語" );}Student.prototype.FourthYear = function() { console.log(this.name+" 第四年修: 曆史" );}
3. 使用方法:
var student = new Student("陳某某"); student.template();
輸出:
陳某某 第一年修: 語文
陳某某 第二年修: 數學
陳某某 第三年修: 英語
陳某某 第四年修: 曆史
其他說明
物件導向中的繼承,一般把行為方法置於最頂層,把狀態成員,置於子類當中;關注行為,而非狀態;
模板方法模式是一個經常用到的模式,體現了物件導向經典的繼承跟複用特點;用於關注固定的邏輯行為,骨架方法用於封裝固定的邏輯過程,開發時要提取這部分統一的過程到抽象類別中去,抽象與具體的設計師分工開發時就可以不受其他影響;