软件的三层架构
引言
三層結(jié)構(gòu)是傳統(tǒng)的客戶/服務(wù)器結(jié)構(gòu)的發(fā)展,代表了企業(yè)級(jí)應(yīng)用的未來(lái),典型的有Web下的應(yīng)用。多層結(jié)構(gòu)和三層結(jié)構(gòu)的含義是一樣的,只是細(xì)節(jié)有所不同。之所以會(huì)有雙層、三層這些提法,是因?yàn)閼?yīng)用程序要解決三個(gè)層面的問(wèn)題。
一、??軟件架構(gòu)和分層
(一)??軟件架構(gòu)(software architecture)
是一系列相關(guān)的抽象模式,用于指導(dǎo)大型軟件系統(tǒng)各個(gè)方面的設(shè)計(jì)。?軟件架構(gòu)是一個(gè)系統(tǒng)的草圖。軟件架構(gòu)描述的對(duì)象是直接構(gòu)成系統(tǒng)的抽象組件。各個(gè)組件之間的連接則明確和相對(duì)細(xì)致地描述組件之間的通訊。在實(shí)現(xiàn)階段,這些抽象組件被細(xì)化為實(shí)際的組件,比如具體某個(gè)類(lèi)或者對(duì)象。在面向?qū)ο箢I(lǐng)域中,組件之間的連接通常用接口(計(jì)算機(jī)科學(xué))來(lái)實(shí)現(xiàn)。?軟件體系結(jié)構(gòu)是構(gòu)建計(jì)算機(jī)軟件實(shí)踐的基礎(chǔ)。與建筑師設(shè)定建筑項(xiàng)目的設(shè)計(jì)原則和目標(biāo),作為繪圖員畫(huà)圖的基礎(chǔ)一樣,一個(gè)軟件架構(gòu)師或者系統(tǒng)架構(gòu)師陳述軟件構(gòu)架以作為滿足不同客戶需求的實(shí)際系統(tǒng)設(shè)計(jì)方案的基礎(chǔ)。
(二)分層
分層是表示將功能進(jìn)行有序的分組:應(yīng)用程序?qū)S霉δ芪挥谏蠈?#xff0c;跨越應(yīng)用程序領(lǐng)域的功能位于中層,而配置環(huán)境專(zhuān)用功能位于低層。分層從邏輯上將子系統(tǒng)劃分成許多集合,而層間關(guān)系的形成要遵循一定的規(guī)則。通過(guò)分層,可以限制子系統(tǒng)間的依賴(lài)關(guān)系,使系統(tǒng)以更松散的方式耦合,從而更易于維護(hù)。子系統(tǒng)的分組標(biāo)準(zhǔn)包含以下幾條規(guī)則可見(jiàn)度。各子系統(tǒng)只能與同一層及其下一層的子系統(tǒng)存在依賴(lài)關(guān)系。
(三)使用分層架構(gòu)開(kāi)發(fā)的必要性
?? ?1、分層設(shè)計(jì)允許你分割功能進(jìn)入不同區(qū)域。換句話說(shuō)層在設(shè)計(jì)是就是邏輯組件的分組。例如,A層可以訪問(wèn)B層,但B層不能訪問(wèn)A 層。
??? 2、用分層的方法,以提高應(yīng)用程序的可維護(hù)性,并使其更容易擴(kuò)展,以提高性能。
(四)設(shè)計(jì)分層的原則
1、層意味著組建的邏輯分組。例如,對(duì)用戶界面,業(yè)務(wù)邏輯和數(shù)據(jù)訪問(wèn)組建應(yīng)該使用不同的不同的層。
2、在一個(gè)層內(nèi)組建應(yīng)該聚合的。如業(yè)務(wù)層組建僅應(yīng)提供與業(yè)務(wù)邏輯相關(guān)的操作,而不是提供其他操作。
3、在設(shè)計(jì)的每一個(gè)層接口時(shí)要考慮好物理邊界。如果通信擴(kuò)月了物理邊界,使用基于消息操作;否則使用基于對(duì)象操作。
4、考慮使用接口類(lèi)型(interface)來(lái)定義每層的接口。這將允許你創(chuàng)建該接口的不同實(shí)現(xiàn),提高可測(cè)性。
5、對(duì)于Web應(yīng)用程序,在表示層和業(yè)務(wù)邏輯層之間實(shí)現(xiàn)基于消息的接口是一個(gè)好主意,即使這兩層沒(méi)有跨越物理邊界。基于消息的接口更適合于無(wú)狀態(tài)的Web操作。
二、軟件的三層架構(gòu)
(一)概述
在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見(jiàn),也是最重要的一種結(jié)構(gòu)。微軟推薦的分層式結(jié)構(gòu)一般分為三層,從下至上分別為:數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層(又或稱(chēng)為領(lǐng)域?qū)?#xff09;、表示層。
1、表示層(UI):通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候他的所見(jiàn)所得。
2、業(yè)務(wù)邏輯層(BLL):針對(duì)具體問(wèn)題的操作,也可以說(shuō)是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理。
3、數(shù)據(jù)訪問(wèn)層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫(kù),針對(duì)數(shù)據(jù)的增添、刪除、修改、查找等。
(二)三層結(jié)構(gòu)原理:?
?
3個(gè)層次中,系統(tǒng)主要功能和業(yè)務(wù)邏輯都在業(yè)務(wù)邏輯層進(jìn)行處理。
所謂三層體系結(jié)構(gòu),是在客戶端與數(shù)據(jù)庫(kù)之間加入了一個(gè)“中間層”,也叫組件層。這里所說(shuō)的三層體系,不是指物理上的三層,不是簡(jiǎn)單地放置三臺(tái)機(jī)器就是三層體系結(jié)構(gòu),也不僅僅有B/S應(yīng)用才是三層體系結(jié)構(gòu),三層是指邏輯上的三層,即使這三個(gè)層放置到一臺(tái)機(jī)器上。三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問(wèn)、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常情況下,客戶端不直接與數(shù)據(jù)庫(kù)進(jìn)行交互,而是通過(guò)COM/DCOM通訊與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫(kù)進(jìn)行交互。
?
(三)各層的作用
?
數(shù)據(jù)訪問(wèn)層:
有時(shí)候也稱(chēng)為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn),可以訪問(wèn)數(shù)據(jù)庫(kù)系統(tǒng)、二進(jìn)制文件、文本文檔或是XML文檔。簡(jiǎn)單的說(shuō)法就是實(shí)現(xiàn)對(duì)數(shù)據(jù)表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那么就會(huì)包括對(duì)象和數(shù)據(jù)表之間的mapping,以及對(duì)象實(shí)體的持久化。主要是對(duì)原始數(shù)據(jù)(數(shù)據(jù)庫(kù)或者文本文件等存放數(shù)據(jù)的形式)的操作層,而不是指原始數(shù)據(jù),也就是說(shuō),是對(duì)數(shù)據(jù)的操作,而不是數(shù)據(jù)庫(kù),具體為業(yè)務(wù)邏輯層或表示層提供數(shù)據(jù)服務(wù)。
?
業(yè)務(wù)邏輯層:
主要是針對(duì)具體的問(wèn)題的操作,也可以理解成對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理,如果說(shuō)數(shù)據(jù)層是積木,那邏輯層就是對(duì)這些積木的搭建。業(yè)務(wù)邏輯層(Business Logic Layer)無(wú)疑是系統(tǒng)架構(gòu)中體現(xiàn)核心價(jià)值的部分。它的關(guān)注點(diǎn)主要集中在業(yè)務(wù)規(guī)則的制定、業(yè)務(wù)流程的實(shí)現(xiàn)等與業(yè)務(wù)需求有關(guān)的系統(tǒng)設(shè)計(jì),也即是說(shuō)它是與系統(tǒng)所應(yīng)對(duì)的領(lǐng)域(Domain)邏輯有關(guān),很多時(shí)候,也將業(yè)務(wù)邏輯層稱(chēng)為領(lǐng)域?qū)印@鏜artin Fowler在《Patternsof Enterprise Application Architecture》一書(shū)中,將整個(gè)架構(gòu)分為三個(gè)主要的層:表示層、領(lǐng)域?qū)雍蛿?shù)據(jù)源層。作為領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的先驅(qū)Eric Evans,對(duì)業(yè)務(wù)邏輯層作了更細(xì)致地劃分,細(xì)分為應(yīng)用層與領(lǐng)域?qū)?#xff0c;通過(guò)分層進(jìn)一步將領(lǐng)域邏輯與領(lǐng)域邏輯的解決方案分離。 業(yè)務(wù)邏輯層在體系架構(gòu)中的位置很關(guān)鍵,它處于數(shù)據(jù)訪問(wèn)層與表示層中間,起到了數(shù)據(jù)交換中承上啟下的作用。由于層是一種弱耦合結(jié)構(gòu),層與層之間的依賴(lài)是向下的,底層對(duì)于上層而言是“無(wú)知”的,改變上層的設(shè)計(jì)對(duì)于其調(diào)用的底層而言沒(méi)有任何影響。如果在分層設(shè)計(jì)時(shí),遵循了面向接口設(shè)計(jì)的思想,那么這種向下的依賴(lài)也應(yīng)該是一種弱依賴(lài)關(guān)系。因而在不改變接口定義的前提下,理想的分層式架構(gòu),應(yīng)該是一個(gè)支持可抽取、可替換的“抽屜”式架構(gòu)。正因?yàn)槿绱?#xff0c;業(yè)務(wù)邏輯層的設(shè)計(jì)對(duì)于一個(gè)支持可擴(kuò)展的架構(gòu)尤為關(guān)鍵,因?yàn)樗缪萘藘蓚€(gè)不同的角色。對(duì)于數(shù)據(jù)訪問(wèn)層而言,它是調(diào)用者;對(duì)于表示層而言,它卻是被調(diào)用者。依賴(lài)與被依賴(lài)的關(guān)系都糾結(jié)在業(yè)務(wù)邏輯層上,如何實(shí)現(xiàn)依賴(lài)關(guān)系的解耦,則是除了實(shí)現(xiàn)業(yè)務(wù)邏輯之外留給設(shè)計(jì)師的任務(wù)。
?
表示層:
位于最外層(最上層),離用戶最近。用于顯示數(shù)據(jù)和接收用戶輸入的數(shù)據(jù),為用戶提供一種交互式操作的界面。主要表示W(wǎng)EB方式,也可以表示成WINFORM方式,WEB方式也可以表現(xiàn)成:aspx, 如果邏輯層相當(dāng)強(qiáng)大和完善,無(wú)論表現(xiàn)層如何定義和更改,邏輯層都能完善地提供服務(wù)。
?
(四)具體調(diào)用
?
微軟的DNA架構(gòu)定義了三個(gè)層:表示層(presentation),業(yè)務(wù)邏輯層(business),和數(shù)據(jù)訪問(wèn)層(data access)。具體又分為:界面外觀層、界面規(guī)則層、業(yè)務(wù)接口層、業(yè)務(wù)邏輯層、實(shí)體層、數(shù)據(jù)訪問(wèn)層、數(shù)據(jù)存儲(chǔ)層共七層,其具體的調(diào)用如圖1所示:
?
(五)規(guī)則
??? 1.系統(tǒng)各層次及層內(nèi)部子層次之間都不得跨層調(diào)用。
??? 2.Entityobject 在各個(gè)層之間傳遞數(shù)據(jù)。
??? 3.需要在UI層綁定到列表的數(shù)據(jù)采用基于關(guān)系的DataSet傳遞,除此之外,應(yīng)該使用Entityobject傳遞數(shù)據(jù)。
??? 4.對(duì)于每一個(gè)數(shù)據(jù)庫(kù)表(Table)都有一個(gè)DB Entity class與之對(duì)應(yīng),針對(duì)每一個(gè)Entityclass都會(huì)有一個(gè)BEM Class與之對(duì)應(yīng)。
??? 5.有些跨數(shù)據(jù)庫(kù)或跨表的操作(如復(fù)雜的聯(lián)合查詢)也需要由相應(yīng)的BEM Class來(lái)提供支持。
??? 6.對(duì)于相對(duì)簡(jiǎn)單的系統(tǒng),可以考慮將Business Function子層和Business Flow 子層合并為一個(gè)。
??? 7.UI層和BL層禁止出現(xiàn)任何SQL語(yǔ)句。
?
?
三、優(yōu)缺點(diǎn)
(一)優(yōu)點(diǎn)
1、開(kāi)發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;
2、可以很容易的用新的實(shí)現(xiàn)來(lái)替換原有層次的實(shí)現(xiàn);
3、可以降低層與層之間的依賴(lài);
4、有利于標(biāo)準(zhǔn)化;
5、利于各層邏輯的復(fù)用。
(二)缺點(diǎn)
1、降低了系統(tǒng)的性能。這是不言而喻的。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫(kù),以此獲取相應(yīng)的數(shù)據(jù),如今卻必須通過(guò)中間層來(lái)完成。
2、有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層中都增加相應(yīng)的代碼。
3、增加了開(kāi)發(fā)成本。
?
(三)為什么要使用三層架構(gòu)
對(duì)于一個(gè)簡(jiǎn)單的應(yīng)用程序來(lái)說(shuō),代碼量不是很多的情況下,一層結(jié)構(gòu)或二層結(jié)構(gòu)開(kāi)發(fā)完全夠用,沒(méi)有必要將其復(fù)雜化,如果對(duì)一個(gè)復(fù)雜的大型系統(tǒng),設(shè)計(jì)為一層結(jié)構(gòu)或二層結(jié)構(gòu)開(kāi)發(fā),那么這樣的設(shè)計(jì)存在很?chē)?yán)重缺陷。下面會(huì)具體介紹,分層開(kāi)發(fā)其實(shí)是為大型系統(tǒng)服務(wù)的。在開(kāi)發(fā)過(guò)程中,初級(jí)程序人員出現(xiàn)相似的功能經(jīng)常復(fù)制代碼,那么同樣的代碼寫(xiě)那么多次,不但使程序變得冗長(zhǎng),更不利于維護(hù),一個(gè)小小的修改或許會(huì)涉及很多頁(yè)面,經(jīng)常導(dǎo)致異常的產(chǎn)生使程序不能正常運(yùn)行。最主要的面向?qū)ο蟮乃枷霙](méi)有得到絲毫的體現(xiàn),打著面向?qū)ο蟮幕献訁s依然走著面向過(guò)程的道路。意識(shí)到這樣的問(wèn)題,初級(jí)程序人員開(kāi)始將程序中一些公用的處理程序?qū)懗晒卜椒?#xff0c;封裝在類(lèi)中,供其它程序調(diào)用。例如寫(xiě)一個(gè)數(shù)據(jù)操作類(lèi),對(duì)數(shù)據(jù)操作進(jìn)行合理封裝,在數(shù)據(jù)庫(kù)操作過(guò)程中,只要類(lèi)中的相應(yīng)方法(數(shù)據(jù)添加、修改、查詢等)可以完成特定的數(shù)據(jù)操作,這就是數(shù)據(jù)訪問(wèn)層,不用每次操作數(shù)據(jù)庫(kù)時(shí)都寫(xiě)那些重復(fù)性 的數(shù)據(jù)庫(kù)操作代碼。在新的應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)訪問(wèn)層可以直接拿來(lái)用。面向?qū)ο蟮娜筇匦灾坏姆庋b性在這里得到了很好的體現(xiàn)。現(xiàn)在找到了面向?qū)ο蟮母杏X(jué),代碼量較以前有了很大的減少,而且修改的時(shí)候也比較方便,也實(shí)現(xiàn)了代碼的重用性。
四、與MVC的區(qū)別
????MVC是三個(gè)單詞的縮寫(xiě),分別為:模型(Model),視圖(View)和控制Controller)。?MVC模式的目的就是實(shí)現(xiàn)Web系統(tǒng)的職能分工。?Model層實(shí)現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通常可以用JavaBean或EJB來(lái)實(shí)現(xiàn)。?View層用于與用戶的交互,通常用JSP來(lái)實(shí)現(xiàn)。?Controller層是Model與View之間溝通的橋梁,它可以分派用戶的請(qǐng)求并選擇恰當(dāng)?shù)囊晥D以用于顯示,同時(shí)它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。
同樣是架構(gòu)級(jí)別的,相同的地方在于他們都有一個(gè)表現(xiàn)層,但是他們不同的地方在于其他的兩個(gè)層。
在三層架構(gòu)中沒(méi)有定義Controller的概念。而MVC也沒(méi)有把業(yè)務(wù)的邏輯訪問(wèn)看成兩個(gè)層,這是采用三層架構(gòu)或MVC搭建程序最主要的區(qū)別。當(dāng)然,在三層中也提到了Model,但是三層架構(gòu)中Model的概念與MVC中Model的概念是不一樣的,“三層”中典型的Model層是以實(shí)體類(lèi)構(gòu)成的,而MVC里,則是由業(yè)務(wù)邏輯與訪問(wèn)數(shù)據(jù)組成的。
?
五、小結(jié)
在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見(jiàn),也是最重要的一種結(jié)構(gòu)。 所以,分層式設(shè)計(jì)可以達(dá)至如下目的:分散關(guān)注、松散耦合、邏輯復(fù)用、標(biāo)準(zhǔn)定義。一個(gè)好的分層式結(jié)構(gòu),可以使得開(kāi)發(fā)人員的分工更加明確。一旦定義好各層次之間的接口,負(fù)責(zé)不同邏輯設(shè)計(jì)的開(kāi)發(fā)人員就可以分散關(guān)注,齊頭并進(jìn)。雖然三層架構(gòu)仍有不可避免的缺陷,但是軟件分層結(jié)構(gòu)使得代碼維護(hù)非常方便,設(shè)計(jì)明確,各層獨(dú)立,專(zhuān)注自己擅長(zhǎng)的領(lǐng)域。通過(guò)這次報(bào)告,對(duì)軟件體系結(jié)構(gòu)又有了更深入的了解。
總結(jié)
- 上一篇: grep 多条件并行满足_用grep 查
- 下一篇: 制作gif动态图片,使用哪款软件,经验分