設計模式之 模板方法模式

2021-07-11 23:36:16 字數 1170 閱讀 3002

一、模式定義

模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

二、所體現出的設計原則

hollywood原則:別呼叫(打**給)我們,我們會呼叫(打**給)你。

此原則要求永遠只能是高層元件(如2中的abstractclass的模板方法)呼叫低層元件(如2中的concreteclass 中的primitiveoperation1方法)。低層元件可以掛鉤到高層元件中,但永遠不能直接呼叫高層元件;以防止高低元件之間互相依賴。

觀察者模式也體現著這樣的原則。

三、uml圖示

四、應用場景

當演算法框架已經確定, 但是小的步驟在不用的情況有不同的實現的時候,最合適用模板方法模式了。 比如說乙個繪圖的程式,可以繪製各種直線和曲線;在進行線條基本路徑繪製完成後,需要進行抗鋸齒處理,但有的曲線需要用方法a進行抗鋸齒,有的曲線需要用方法b進行抗鋸齒。此時線條繪製的基本邏輯框架定義在父類中,但抗鋸齒這一小步驟的實現則分布在各個子類中,避免了**的冗餘。

還有乙個更加著名的例子,就是windows程式設計中的鉤子技術,是模板方法模式的最好應用。比如說在自己的程式中掛上乙個監控鍵盤輸入的鉤子,如果使用者輸入***,就進行相應的操作,不過小心別被360給當成木馬給kill了。

五、注意事項

現實中有一些特殊的模板方法模式應用。比如說stl中的std::sort()方法,可以對容器中的物件進行排序,但需要提供乙個仿函式,用於容器物件之間的比較。比如說:

[cpp]view plain

copy

vectormyvector;  

class cmpfunctor     

};  

std::sort(myvector.begin(),  myvector.end(),cmpfunctor);  

stl方法sort()本身就是乙個模板方法模式的應用,客戶提供比較的工具,就是cmpfunctor,在sort()中用函式指標呼叫此仿函式。這裡即便沒有繼承,我覺得也可以看成是模板方法模式的應用,理解正確麼???

六、舉例說明

參照四七、**示例

維基百科:

模板設計模式 PHP設計模式之模板方法模式

模板方法模式,也是我們經常會在不經意間有會用到的模式之一。這個模式是對繼承的最好詮釋。當子類中有重複的動作時,將他們提取出來,放在父類中進行統一的處理,這就是模板方法模式的最簡單通俗的解釋。就像我們平時做專案,每次的專案流程實都差不多,都有調研 開發 測試 部署上線等流程。而具體到每個專案中,這些流...

設計模式之模板方法設計模式

父類抽象出子類共有的方法,子類實現各自不同的業務。總之就是一種行為有他們共同的方法,只是他們具體的實現不一樣。比如開車這種行為模式,啟動 換擋 踩油門。每種型號品牌的車都有共同的行為,但是不同型號品牌的車的實現方式可能不同,需要每個品牌型號的車自己實現這些功能。這樣的定義上面行為的模式,稱之為模板方...

設計模式之模板方法模式

定義 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟 型別 行為類模式 事實上,模板方法是程式設計中乙個經常用到的模式。比如,給定乙個整數陣列,把陣列中的數由大到小順序,然後把排序之後的結果列印出來。這個需求大體可以分為兩部分,...