前言
《設(shè)計模式》這本經(jīng)典的書里面定義了20多種設(shè)計模式,雖然都是面向?qū)ο蟮模坪跣枰?a href="http://m.xsypw.cn/tags/C++/" target="_blank">C++、Java這樣的語言才能實現(xiàn),但是根據(jù)筆者前面反復(fù)強(qiáng)調(diào)的,Linux內(nèi)核雖然是用C語言和匯編語言寫成,但是其實也到處充滿了面向?qū)ο蟮脑O(shè)計。面向?qū)ο蟾嗟氖且环N思想,而不是一個語言。我們可以用C語言實現(xiàn)極大的OO,Linux內(nèi)核到處都有OO。
模板方法
比如,在Linux的設(shè)備驅(qū)動框架中,就用了一種非常經(jīng)典簡單的設(shè)計模式——模板方法(Template Method),當(dāng)然還有一些其他的設(shè)計模式。而設(shè)計模式牛逼的地方在于,高手往往不經(jīng)意之間已經(jīng)用到了設(shè)計模式,甚至自己都不知道。如果高手沒有系統(tǒng)地學(xué)習(xí)過設(shè)計模式,這其實不見得是一個問題。這并不意味著它不懂設(shè)計模式,只是他自己都不知道自己用到了哪個模式。而設(shè)計模式學(xué)習(xí)的終極目的,當(dāng)然也是忘記設(shè)計模式,這個跟練獨孤九劍沒什么區(qū)別,到最后其實是無招勝有招。
模板方法這個模式,強(qiáng)調(diào)定義一個基類,這個基類實現(xiàn)了通用的流程和算法。比如做一件事情需要經(jīng)過step1()、step2()、step3()。那么我們定義一個基類:
而其中的step1()、step2()、step3()、step4()具體如何實現(xiàn)則是因人而異,所以我們從baseClass類里面,繼承出來的類里面,實現(xiàn)step1()、step2()、step3()這樣的代碼,override掉baseClass里面的函數(shù)。
這樣的設(shè)計讓外部不關(guān)心derivedClass,因為流程和接口都是在基類的。而基類實現(xiàn)的doSomething()成員函數(shù),是對外的接口。這個UML關(guān)系是非常簡單的:
驅(qū)動案例
在Linux設(shè)備驅(qū)動里面,大量存在類似的設(shè)計,我們以NAND為例子。在drivers/mtd/nand/nand_base.c這層里面,定義了NAND的一些操作流程。
比如寫OOB的代碼:
它這個里面要走cmdfunc()、write_buf()、cmdfunc()、waitfunc()這些步驟,這些步驟,不管是全世界哪個NAND的硬件,都是一樣的通用的,但是具體的不同的NAND硬件控制器,實現(xiàn)這些步驟中涉及到的cmdfunc()等函數(shù)的實現(xiàn)方法卻因人而異。
譬如freescale的版本fsl_elbc_nand.c就是:
nand_base.c這個C文件是NAND的中間層,它非常類似我們前面說的實現(xiàn)baseClass這一層的代碼,nand_write_oob_std函數(shù)類似baseClass :: doSomething。而Linux驅(qū)動中定義的nand_chip的各個不同的NAND控制器,對nand_chip這個結(jié)構(gòu)體中成員函數(shù)cmdfunc()、write_buf()等的實現(xiàn)則是各異的,類似derivedClass里面override掉step1()、step2()。nand_chip定義在include/linux/mtd/nand.h:
這樣的設(shè)計,好處是非常明顯的。特定的硬件只用管與自身操作相關(guān)的事情,而通用的流程,都由nand_base搞定,最大程度上減小了具體實例的代碼量,也最大程度上復(fù)用了中間層的代碼。
這樣的例子無處不在,比如我們在LCD的中間層:
后語
本文后語不搭前言,請見諒。最近有很多童鞋詢問筆者,做Linux驅(qū)動有沒有前途?筆者明確地告訴大家:根本沒有前途!但是前途是自己賺的,這依賴你從驅(qū)動進(jìn)去,但是從更大的視角出來:
1.通過做驅(qū)動理解很多OO的架構(gòu)設(shè)計思想,升華自己高內(nèi)聚和低耦合的理解,把自己變成一個更高level的software engineer;
2.通過做驅(qū)動,進(jìn)一步理解Linux本身的進(jìn)程、內(nèi)存、IO等知識,升華對軟件系統(tǒng)和性能分析的理解,把自己變成一個更高level的技術(shù)expert。
如果做了5年驅(qū)動,進(jìn)入的時候是調(diào)試寄存器搞示波器,出來的時候還是調(diào)寄存器搞示波器,那自然是完全沒有什么前途的!
有沒有前途,這個事情,完全是因人而異的。前途是無所謂有,無所謂無的。你如果有抽象、衍生的能力和不斷學(xué)習(xí)總結(jié)的精神,無論是做驅(qū)動還是不做驅(qū)動,都會是很有前途的事情。反之,做什么基本都沒前途。
-
Linux
+關(guān)注
關(guān)注
87文章
11419瀏覽量
212288 -
C語言
+關(guān)注
關(guān)注
180文章
7626瀏覽量
139629
原文標(biāo)題:宋寶華:Linux設(shè)備驅(qū)動框架里的設(shè)計模式之——模板方法(Template Method)
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
一種簡單的逆變器輸出直流分量消除方法
華清遠(yuǎn)見教程
一種改進(jìn)的自適應(yīng)模板匹配法
模板方法模式在回溯算法中的應(yīng)用
STEP模式映射的一種實用方法
基于模板匹配的電子元器件針腳檢測方法
一種針對DoT算法的模板攻擊方法

一種針對DoT算法的模板攻擊方法

評論