摘要:目錄模板方法為什么使用模板方法模板方法應(yīng)用實例模板方法模板方法在一個方法中定義一個算法的框架,然后將該方法中的一些步驟延遲到子類中,使得再不改變算法的前提下,重新定義自己的算法。
目錄
模板方法
為什么使用模板方法
模板方法應(yīng)用實例
模板方法模板方法:在一個方法中定義一個算法的框架,然后將該方法中的一些步驟延遲到子類中,使得再不改變算法的前提下,重新定義自己的算法。
看了模板方法的定義,可能感覺這和策略模式?jīng)]有什么區(qū)別,都是對算法的封裝,但是其差別在那里呢?
區(qū)別:策略模式是通過組合的方式將多個類的方法組合在一起,而模板方法是通過繼承來實現(xiàn)的,即為在父類中有一個final的不可修改的方法,將我們的算法邏輯寫在里面,然后其組合起來的算法可以在其子類中具體的根據(jù)實際情況去定義。
為什么要用模板方法現(xiàn)在我們要實現(xiàn)一個流水線,這個流水線上,我們可以生產(chǎn)過的機(jī)器,而這些機(jī)器組成上是存在一些差別的,如果機(jī)器的種類不是很多,我們可以針對每一個機(jī)器都做一條流水線,但是如果機(jī)器種類很多,如果這些機(jī)器的出貨時間是不同的,那么一旦第一批貨出完,那么該機(jī)器的生產(chǎn)流水線就會閑置下來,利用率就會很低,以此類比,如果我們針對每種機(jī)型創(chuàng)建一個類,勢必會使得我們的代碼很臃腫,會有很多的重復(fù)代碼存在,根據(jù)設(shè)計模式的基本原則,將不變的抽離出來,對變化的部分進(jìn)行封裝,通過這來使我們的代碼更簡潔的同時減少后期的維護(hù)成本。
因此我們可以這么寫
//機(jī)器裝配的基類 public abstract class Machine{ //機(jī)器裝配的流程,final不可被復(fù)寫,保證方裝配算法不被破壞 final void produce(){ createFrame(); addHead(); addBody(); if(ifDressup()) dressUp(); } //創(chuàng)建框架 public abstract void createFrame(); //添加一個機(jī)器頭 public abstract void addHead(); //添加一個機(jī)器的身子 public abstract void addBody(); //為機(jī)器進(jìn)行裝扮 public abstract void dressUp(); //判斷是否為該機(jī)器進(jìn)行裝扮 public boolean ifDressup(){ return true; } } //繼承自基類的一個子類 public class InflatableDoll{ public void createFrame(){ System.out.println("This is a Frame"); } public void addBody(){ System.out.println("This is a body"); } public void dressUp(){ System.out.println("This is a beautiful cloth"); } }
上述有注釋的地方就不在此啰嗦了,上一篇結(jié)尾的時候要說下的一個鉤子方法,這里提一下,這里的豆子方法就是ifDressup(),如果沒有鉤子方法,我們的的裝配算法邏輯在父類中是final的,我們是不可以對其進(jìn)行控制的,因此也就喪失了靈活性,當(dāng)然我們希望能夠在子類中對其進(jìn)行控制,這樣我們就可以更靈活的控制這個裝配過程,因此出現(xiàn)了鉤子方法,通過鉤子方法將我們的子類和父類掛接起來,在我們的模板方法中將鉤子方法作為一個裝配條件,然后在我們的子類中根據(jù)我們自己的要求來覆寫這個方法。、
模板方法應(yīng)用實例現(xiàn)實中,有那些例子呢?看到著,應(yīng)該能夠想起來一些什么,我們開發(fā)中的view,大多都是通過這種方式來進(jìn)行的。以Android中的view為例子
public class View{ /** * 鉤子操作,空實現(xiàn) */ protected void onDraw(Canvas canvas) { } /** *鉤子操作,空實現(xiàn) */ protected void dispatchDraw(Canvas canvas) { } //算法骨架 public void draw(Canvas canvas) { if (!verticalEdges && !horizontalEdges) { // 步驟1 if (!dirtyOpaque) onDraw(canvas); // 步驟2 dispatchDraw(canvas); // 步驟3 onDrawScrollBars(canvas); return; } } //... ... }
View類
public class MyView extends View { public MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); } }
通過上面的例子,我們可以看出我們的view控件繪制的一個流程。
下篇更新工廠模式,這個是當(dāng)時看的時候最迷糊的一個了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64632.html
摘要:目錄代理模式為什么使用代理模式應(yīng)用實例代理模式對于代理模式,和委托方式分不開,感覺委托和代理沒有什么區(qū)別,而委托卻不被稱做一個設(shè)計模式,今天再次看代理模式,才有所理解。回到正題代理模式為對象提供一個替身或者是占一個位子,從而控制對其訪問。 目錄 代理模式 為什么使用代理模式 應(yīng)用實例 代理模式 對于代理模式,和委托方式分不開,感覺委托和代理沒有什么區(qū)別,而委托卻不被稱做一個設(shè)計模式...
摘要:是的源碼,算是一個基本的博客系統(tǒng),包含文章發(fā)布,關(guān)注,評論等功能。這些功能可以說是任何一個網(wǎng)站的基礎(chǔ)。比如運(yùn)營數(shù)據(jù)配置和其他數(shù)據(jù)配置分開,因為很有可能需要做一個小的工具來讓非技術(shù)人員配置相關(guān)參數(shù)。模式在中有一個專門的章節(jié)來講解。 1. About 1.1 what: nodeclub是cnodejs.com的源碼,cnode算是一個基本的博客系統(tǒng),包含文章發(fā)布, 關(guān)注,評論等功能...
摘要:神經(jīng)網(wǎng)絡(luò)以上驗證碼識別都依賴于字符切分,切分的好壞幾乎直接決定識別的準(zhǔn)確程度。目前驗證碼識別最先進(jìn)的是谷歌在識別街景圖像中門牌號碼中使用的一套的算法。 最近在一個爬蟲項目中遇到了驗證碼,需要機(jī)器自動識別繞過。剛好與題主的問題類似,在這里做一些分享。 在網(wǎng)上調(diào)研了資料和文獻(xiàn)后,分別采用OCR識別和模板庫匹配方法對不同類型驗證碼進(jìn)行了識別。主要過程可以分解為三個步驟:1.圖片清理,2.字符...
閱讀 2948·2023-04-26 01:52
閱讀 3475·2021-09-04 16:40
閱讀 3633·2021-08-31 09:41
閱讀 1767·2021-08-09 13:41
閱讀 567·2019-08-30 15:54
閱讀 2967·2019-08-30 11:22
閱讀 1619·2019-08-30 10:52
閱讀 953·2019-08-29 13:24