模板方法模式 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。 模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。通俗的說的就是有很多相同的步驟的,在某一些地方可能有一些差別適合於這種模式,如大話設計模式中說到的考試場景中,每個人的試卷都是一樣的,只有答案不一樣。這種場景 ...
模板方法模式
定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。 模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。通俗的說的就是有很多相同的步驟的,在某一些地方可能有一些差別適合於這種模式,如大話設計模式中說到的考試場景中,每個人的試卷都是一樣的,只有答案不一樣。這種場景就適合於模板方法模式。我這次自己寫的是一個汽車啟動的過程,每一種汽車啟動的過程都基本是一樣的流程,無非是這一過程中存在一些細小差別。
模板方法模式UML圖
模板方法模式代碼
package com.roc.template; /** * 汽車模型 * 模型模式 * @author liaowp * */ public abstract class CarModel { /** * 汽車啟動 */ protected abstract void start(); /** * 停車 */ protected abstract void stop(); /** * 用戶並不需要關註你的車怎麼啟動或者停下來的,可以開可以停就可以啦 */ final public void excet(){ this.start(); this.stop(); } }
package com.roc.template; /** * 大眾車 * @author liaowp * */ public class Wcar extends CarModel{ @Override protected void start() { System.out.println("大眾車啟動 。。。。。。。。突突突"); } @Override protected void stop() { System.out.println("大眾車停車。。。。。。。。。"); } }
package com.roc.template; public class Ocar extends CarModel{ @Override protected void start() { System.out.println("奧迪 無匙啟動 突突突"); } @Override protected void stop() { System.out.println("奧迪 停車 "); } }
package com.roc.template; /** * 客戶端 * @author liaowp * */ public class Client { public static void main(String[] args) { CarModel wcar=new Wcar();//家裡的第一輛車,作為用戶的我們並不需要關註車怎麼啟動的.子類變數變為父類。多態 wcar.excet(); //突然家裡需要第二輛車了 奧迪 我們也不需要關註他怎麼生產啟動的 CarModel ocar=new Ocar(); ocar.excet(); } }
模板方法模式適用場景
- 一次性實現一個演算法的不變的部分,並將可變的行為留給子類來實現。
- 各子類中公共的行為應被提取出來並集中到一個公共父類中以避免代碼重覆。這是Opdyke和Johnson所描述過的“重分解以一般化”的一個很好的例子。首先識別現有代碼中的不同之處,並且將不同之處分離為新的操作。最後,用一個調用這些新的操作的模板方法來替換這些不同的代碼。
- 控制子類擴展。模板方法只在特定點調用“hook”操作,這樣就只允許在這些點進行擴展。