1. 雜言:
設計模式,現在覺得每種模式像工業行業的一些典型零件。這些零件也可以變種出很多類似零件。吧這些零件組合起來,就成了一台機器。好吧,我現在是這麼理解的。
一般**結構都是,一層呼叫一層,就是一般都是頂層的呼叫底層的。但模板方法確實反過來的,有父類呼叫子類的方法。這個聽說又牽扯到啥好萊塢原則。對於這種理論的了解多看就懂了,其實相對於其他模式,這個模板方法可能以前**頁經常用到。也就是不經意間可能就會用到了。不過深入學習下可能對以後的使用會更加嚴謹和靈活。
2. 理論:
定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。template method使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。
3. uml圖:
我畫的圖
4. 舉例:
今天我比較嚴肅,所以舉個正常點的例子。比如我們平時要做菜,做菜其實就是材料加做法,然後就完成了一道美味的加油。我現在用**實現乙個番茄炒蛋的製作過程,來說明下這個模板方法模式。
a. 遇到問題
說到做菜,那問題來了。山東藍翔。。。哦不,用**實現乙個番茄炒蛋的過程簡單。但要做其他菜餚呢。現在寫**都講究通用是不?所以我想寫出個通用的模板來實現各種菜的製作過程。這時,就可以用上今天的主題了——模板方法設計模式。
b.**實現
定義模板抽象類
package prov.sue.design.template;
public abstract class abstractdishes
public abstract void putmaterial();
public abstract void whithmethod();
}
然後實現番茄炒蛋細節部分。
package prov.sue.design.template;
public class fqcddishes extends abstractdishes
@override
public void whithmethod()
}
應用
package prov.sue.design;
import prov.sue.design.template.abstractdishes;
import prov.sue.design.template.fqcddishes;
public class designmain
}
c. 結果輸出
放蛋,放番茄
炒
5. 應用例項:使用過servlet的人都清楚,除了要在web.xml做相應的配置外,還需繼承乙個叫httpservlet的抽象類。httpservice類提供了乙個service()方法,這個方法呼叫七個do方法中的乙個或幾個,完成對客戶端呼叫的響應。這些do方法需要由httpservlet的具體子類提供,因此這是典型的模板方法模式。下面是service()方法的源**:
}當然,這個service()方法也可以被子類置換掉。
下面給出乙個簡單的servlet例子:
從上面的類圖可以看出,testservlet類是httpservlet類的子類,並且置換掉了父類的兩個方法:doget()和dopost()。
}從上面的例子可以看出這是乙個典型的模板方法模式。
httpservlet擔任抽象模板角色
模板方法:由service()方法擔任。
基本方法:由dopost()、doget()等方法擔任。
testservlet擔任具體模板角色
testservlet置換掉了父類httpservlet中七個基本方法中的其中兩個,分別是doget()和dopost()。
設計模式學習 模板方法模式
型別 行為模式 模板方法模式定義乙個操作中演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些 特定步驟。uml圖 新建賽車的父類 package car package public class car parent public void setsp...
設計模式學習 模板方法模式
模板方法模式 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟.父類就應該要成為子類的模板,所有重複的 都應該要上公升到父類中,而不是讓每個子類都取重複,重要,複雜的演算法,可以把核心演算法設計為模板方法,周邊的相關細...
設計模式學習 模板方法模式
模板方法模式,定義乙個操作中的演算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板發放模式特點 模板方法模式就是通過把不變行為搬移到超類,去除子類中的重複 來體現它的優勢。模板方法模式就是提供了乙個很好的 復用平台。當不變的和可變的行...