面向接口編程綜述
在系統(tǒng)分析和架構(gòu)中躬柬,每個(gè)層次不是直接向上提供服務(wù)(即不是直接實(shí)例化在上層中)焦蘑,而是通過(guò)定義一組接口查乒,僅向上層暴露接口功能弥喉,
上層對(duì)下層的依賴,僅僅是接口的依賴而不是具體類的依賴玛迄。
這樣做的好處是顯而易見(jiàn)的由境,首先對(duì)系統(tǒng)靈活性有大的好處,當(dāng)下層需要改變的時(shí)候蓖议,只要接口和接口的功能不變虏杰,上層不需要做任何修改,甚至可以在不改動(dòng)上層代碼時(shí)將下層整個(gè)替換掉勒虾,
就像我們將一個(gè)WD的60G硬盤換成一個(gè)希捷的160G的硬盤纺阔,計(jì)算機(jī)其他地方不用做任何改動(dòng),而是把原硬盤拔下來(lái)修然、新硬盤插上就行了笛钝,因?yàn)橛?jì)算機(jī)其他部分不依賴具體硬盤,而只依賴一個(gè)IDE接口愕宋,只要硬盤實(shí)現(xiàn)了這個(gè)接口玻靡,就可以替換上去。從這里看掏婶,程序中的接口和現(xiàn)實(shí)中的接口極為相似啃奴,所以我一直認(rèn)為,接口(interface)這個(gè)詞用的真是神似!
另外關(guān)于架構(gòu)的分層相關(guān)的描述
在.NET平臺(tái)上雄妥,比較經(jīng)典的分層架構(gòu)是三層架構(gòu)最蕾,從下到上依次是:數(shù)據(jù)訪問(wèn)層依溯、業(yè)務(wù)邏輯層、表示層瘟则。各層職責(zé)如下:
數(shù)據(jù)訪問(wèn)層:負(fù)責(zé)與數(shù)據(jù)源交互黎炉,完成數(shù)據(jù)訪問(wèn)等一系列操作。
業(yè)務(wù)邏輯層:完成與系統(tǒng)業(yè)務(wù)有關(guān)的邏輯操作醋拧。
表示層:負(fù)責(zé)與用戶交互慷嗜、呈現(xiàn)數(shù)據(jù)等一切與系統(tǒng)表示有關(guān)的操作。
剛才我們說(shuō)過(guò)丹壕,分層架構(gòu)下是向下依賴的(不考慮依賴倒置)庆械,也就是業(yè)務(wù)邏輯層要調(diào)用數(shù)據(jù)訪問(wèn)層完成與數(shù)據(jù)源有關(guān)的操作,而表示層調(diào)用業(yè)務(wù)邏輯層完成業(yè)務(wù)邏輯工作菌赖。但是缭乘,表示層對(duì)數(shù)據(jù)訪問(wèn)層是沒(méi)有依賴的。
在這個(gè)架構(gòu)中琉用,每一層都不是一個(gè)類堕绩,而是一個(gè)類族,例如邑时,在一個(gè)CMS系統(tǒng)中奴紧,數(shù)據(jù)訪問(wèn)層可能會(huì)有一系列的類,分別負(fù)責(zé)用戶晶丘、文章黍氮、評(píng)論等業(yè)務(wù)實(shí)體的數(shù)據(jù)訪問(wèn)操作,而業(yè)務(wù)邏輯層也一樣铣口。
如果我們直接依賴滤钱,即業(yè)務(wù)邏輯層實(shí)例化數(shù)據(jù)訪問(wèn)層的類,表示層再實(shí)例化業(yè)務(wù)邏輯層的類脑题,會(huì)造成強(qiáng)耦合件缸。如果我想把數(shù)據(jù)庫(kù)從SQLServer換成MySQL,則要改變整個(gè)業(yè)務(wù)邏輯層代碼叔遂,這是個(gè)不好的設(shè)計(jì)他炊。(還記得“開(kāi)放-關(guān)閉”原則嗎)
所以,一般的做法是已艰,為數(shù)據(jù)訪問(wèn)層和業(yè)務(wù)邏輯層分別定義一族接口痊末,業(yè)務(wù)邏輯層不依賴具體的數(shù)據(jù)訪問(wèn)層,而是僅依賴數(shù)據(jù)訪問(wèn)層的接口族哩掺,表示層也一樣凿叠,依賴業(yè)務(wù)邏輯層的接口族。
如此一來(lái),當(dāng)要更換數(shù)據(jù)庫(kù)時(shí)盒件,我們就不必改寫整個(gè)業(yè)務(wù)邏輯層蹬碧,因?yàn)闃I(yè)務(wù)邏輯層里根本沒(méi)有任何數(shù)據(jù)訪問(wèn)層中的具體類,而全是通過(guò)接口實(shí)現(xiàn)的炒刁。
在.NET中恩沽,只要配合配置文件和反射機(jī)制,再運(yùn)用Abstract Factory設(shè)計(jì)模式翔始,就可以實(shí)現(xiàn)“依賴注入”罗心,即在不改動(dòng)代碼的情況下根據(jù)配置選擇相應(yīng)的層次組件。這樣城瞎,我們就可以為不通數(shù)據(jù)庫(kù)分別實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)層渤闷,也可以編寫ORM的數(shù)據(jù)訪問(wèn)層,甚至是基于XML的全谤,只要實(shí)現(xiàn)了數(shù)據(jù)訪問(wèn)層接口族肤晓,就可以和業(yè)務(wù)邏輯層無(wú)縫連接,從而極大提高了軟件的靈活性和可維護(hù)性认然。當(dāng)然要更改業(yè)務(wù)邏輯層也是一樣。
具體可以參考:
http://www.cnblogs.com/leoo2sk/archive/2008/04/14/1151569.html