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