前言
《設(shè)計(jì)模式》這本經(jīng)典的書里面定義了20多種設(shè)計(jì)模式,雖然都是面向?qū)ο蟮?,似乎需?a href="http://www.brongaenegriffin.com/tags/C++/" target="_blank">C++、Java這樣的語言才能實(shí)現(xiàn),但是根據(jù)筆者前面反復(fù)強(qiáng)調(diào)的,Linux內(nèi)核雖然是用C語言和匯編語言寫成,但是其實(shí)也到處充滿了面向?qū)ο蟮脑O(shè)計(jì)。面向?qū)ο蟾嗟氖且环N思想,而不是一個(gè)語言。我們可以用C語言實(shí)現(xiàn)極大的OO,Linux內(nèi)核到處都有OO。
模板方法
比如,在Linux的設(shè)備驅(qū)動(dòng)框架中,就用了一種非常經(jīng)典簡單的設(shè)計(jì)模式——模板方法(Template Method),當(dāng)然還有一些其他的設(shè)計(jì)模式。而設(shè)計(jì)模式牛逼的地方在于,高手往往不經(jīng)意之間已經(jīng)用到了設(shè)計(jì)模式,甚至自己都不知道。如果高手沒有系統(tǒng)地學(xué)習(xí)過設(shè)計(jì)模式,這其實(shí)不見得是一個(gè)問題。這并不意味著它不懂設(shè)計(jì)模式,只是他自己都不知道自己用到了哪個(gè)模式。而設(shè)計(jì)模式學(xué)習(xí)的終極目的,當(dāng)然也是忘記設(shè)計(jì)模式,這個(gè)跟練獨(dú)孤九劍沒什么區(qū)別,到最后其實(shí)是無招勝有招。
模板方法這個(gè)模式,強(qiáng)調(diào)定義一個(gè)基類,這個(gè)基類實(shí)現(xiàn)了通用的流程和算法。比如做一件事情需要經(jīng)過step1()、step2()、step3()。那么我們定義一個(gè)基類:

而其中的step1()、step2()、step3()、step4()具體如何實(shí)現(xiàn)則是因人而異,所以我們從baseClass類里面,繼承出來的類里面,實(shí)現(xiàn)step1()、step2()、step3()這樣的代碼,override掉baseClass里面的函數(shù)。

這樣的設(shè)計(jì)讓外部不關(guān)心derivedClass,因?yàn)榱鞒毯?a target="_blank">接口都是在基類的。而基類實(shí)現(xiàn)的doSomething()成員函數(shù),是對(duì)外的接口。這個(gè)UML關(guān)系是非常簡單的:

驅(qū)動(dòng)案例
在Linux設(shè)備驅(qū)動(dòng)里面,大量存在類似的設(shè)計(jì),我們以NAND為例子。在drivers/mtd/nand/nand_base.c這層里面,定義了NAND的一些操作流程。
比如寫OOB的代碼:

它這個(gè)里面要走cmdfunc()、write_buf()、cmdfunc()、waitfunc()這些步驟,這些步驟,不管是全世界哪個(gè)NAND的硬件,都是一樣的通用的,但是具體的不同的NAND硬件控制器,實(shí)現(xiàn)這些步驟中涉及到的cmdfunc()等函數(shù)的實(shí)現(xiàn)方法卻因人而異。
譬如freescale的版本fsl_elbc_nand.c就是:

nand_base.c這個(gè)C文件是NAND的中間層,它非常類似我們前面說的實(shí)現(xiàn)baseClass這一層的代碼,nand_write_oob_std函數(shù)類似baseClass :: doSomething。而Linux驅(qū)動(dòng)中定義的nand_chip的各個(gè)不同的NAND控制器,對(duì)nand_chip這個(gè)結(jié)構(gòu)體中成員函數(shù)cmdfunc()、write_buf()等的實(shí)現(xiàn)則是各異的,類似derivedClass里面override掉step1()、step2()。nand_chip定義在include/linux/mtd/nand.h:

這樣的設(shè)計(jì),好處是非常明顯的。特定的硬件只用管與自身操作相關(guān)的事情,而通用的流程,都由nand_base搞定,最大程度上減小了具體實(shí)例的代碼量,也最大程度上復(fù)用了中間層的代碼。
這樣的例子無處不在,比如我們?cè)贚CD的中間層:

后語
本文后語不搭前言,請(qǐng)見諒。最近有很多童鞋詢問筆者,做Linux驅(qū)動(dòng)有沒有前途?筆者明確地告訴大家:根本沒有前途!但是前途是自己賺的,這依賴你從驅(qū)動(dòng)進(jìn)去,但是從更大的視角出來:
1.通過做驅(qū)動(dòng)理解很多OO的架構(gòu)設(shè)計(jì)思想,升華自己高內(nèi)聚和低耦合的理解,把自己變成一個(gè)更高level的software engineer;
2.通過做驅(qū)動(dòng),進(jìn)一步理解Linux本身的進(jìn)程、內(nèi)存、IO等知識(shí),升華對(duì)軟件系統(tǒng)和性能分析的理解,把自己變成一個(gè)更高level的技術(shù)expert。
如果做了5年驅(qū)動(dòng),進(jìn)入的時(shí)候是調(diào)試寄存器搞示波器,出來的時(shí)候還是調(diào)寄存器搞示波器,那自然是完全沒有什么前途的!
有沒有前途,這個(gè)事情,完全是因人而異的。前途是無所謂有,無所謂無的。你如果有抽象、衍生的能力和不斷學(xué)習(xí)總結(jié)的精神,無論是做驅(qū)動(dòng)還是不做驅(qū)動(dòng),都會(huì)是很有前途的事情。反之,做什么基本都沒前途。
-
Linux
+關(guān)注
關(guān)注
88文章
11628瀏覽量
217980 -
C語言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
144616
原文標(biāo)題:宋寶華:Linux設(shè)備驅(qū)動(dòng)框架里的設(shè)計(jì)模式之——模板方法(Template Method)
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
一種簡單的逆變器輸出直流分量消除方法
華清遠(yuǎn)見教程
一種改進(jìn)的自適應(yīng)模板匹配法
模板方法模式在回溯算法中的應(yīng)用
STEP模式映射的一種實(shí)用方法
基于模板匹配的電子元器件針腳檢測(cè)方法
一種針對(duì)DoT算法的模板攻擊方法
一種針對(duì)DoT算法的模板攻擊方法

宋寶華:一種非常經(jīng)典簡單的設(shè)計(jì)模式——模板方法
評(píng)論