三层架构与设计模式思想部署企业级数据库业务系统开发
?
1.?三層架構(gòu)介紹
?
1.1關(guān)于架構(gòu)
?
架構(gòu)這個(gè)詞從它的出現(xiàn)后,就有許許多多的程序員、架構(gòu)師們激烈地討論著它的發(fā)展,但是架構(gòu)一詞的出現(xiàn),卻是隨著三層架構(gòu)的出現(xiàn)才出現(xiàn)的。當(dāng)然,目前應(yīng)用三層架構(gòu)開發(fā)也正是業(yè)界最關(guān)注的主題。那么這里我們來(lái)看看單層、雙層、三層甚至多層架構(gòu)到底是怎么一回事。單層結(jié)構(gòu)是80年代以來(lái)小型應(yīng)用的結(jié)構(gòu),在那個(gè)結(jié)構(gòu)化編程充斥的時(shí)代,還沒有出現(xiàn)架構(gòu)的概念,典型的是基于Dbase、Foxbase等小型數(shù)據(jù)庫(kù)的應(yīng)用。雙層結(jié)構(gòu)的同義詞可以理解為傳統(tǒng)的客戶/服務(wù)器結(jié)構(gòu),盡管目前占統(tǒng)治地位的結(jié)構(gòu),但是其封裝移植等方面的缺陷,已使它步入暮年,典型是基于Oracle、Infomix等大型數(shù)據(jù)庫(kù)的C/S應(yīng)用。三層結(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)題。
?
1.2三層架構(gòu)概述
?
隨著軟件工程的不斷進(jìn)步和規(guī)范以及面向?qū)ο缶幊趟枷氲膽?yīng)用,人們對(duì)封裝、復(fù)用、擴(kuò)展、移置等方面的要求,使得雙層架構(gòu)顯然更加臃腫繁瑣,三層程序架構(gòu)體系應(yīng)?運(yùn)而生,可以說(shuō),三層架構(gòu)體系結(jié)構(gòu)是面向?qū)ο笏枷氚l(fā)展中的必然產(chǎn)物。當(dāng)然三層架構(gòu)對(duì)于目前來(lái)說(shuō)早已經(jīng)不是什么新鮮事物了,最早聽到這個(gè)詞應(yīng)該是幾年前使用java知道的吧,?j2ee三層架構(gòu)體系流行了這么多年,一直沒有使用過(guò),不過(guò)j2ee三層架構(gòu)體系的提出,對(duì)軟件系統(tǒng)的架構(gòu)產(chǎn)生了巨大的影響,Microsoft、Boland這些公司自然不甘落后,例如Microsoft的.net平臺(tái),更有甚者,稱.net之c#為java的兒子。那么何謂三層架構(gòu)?所謂三層架構(gòu),是在客戶/服務(wù)之間加入了一個(gè)"中間層",也叫組件層。它與客戶層、服務(wù)器層共同構(gòu)成了三層體系。這里所說(shuō)的三層體系,不是指物理上的三層,不是簡(jiǎn)單地放置三臺(tái)機(jī)器就是三層體系結(jié)構(gòu),也不僅僅有B/S應(yīng)用才有三層體系結(jié)構(gòu),三層是指邏輯上的三層。通過(guò)引入中間層,將復(fù)雜的商業(yè)邏輯從傳統(tǒng)的雙層結(jié)構(gòu)(Client-Server)應(yīng)用模型中分離出來(lái),并提供了可伸縮、易于訪問(wèn)、易于管理的方法,可以將多種應(yīng)用服務(wù)分別封裝部署于應(yīng)用服務(wù)器,同時(shí)增強(qiáng)了應(yīng)用程序可用性、安全性、封裝復(fù)用性、可擴(kuò)展性和可移置性,使用戶在管理上所花費(fèi)的時(shí)間最小化,從而實(shí)現(xiàn)了便捷、高效、安全、穩(wěn)定的企業(yè)級(jí)系統(tǒng)應(yīng)用。
?
1.3分層描述三層架構(gòu)
?
三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問(wèn)、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常情況下,客戶端不直接與數(shù)據(jù)庫(kù)進(jìn)行交互,而是中間層向外提供接口,通過(guò)COM/DCOM通訊或者Http等方式與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫(kù)進(jìn)行交互。當(dāng)然數(shù)據(jù)通過(guò)中間層的中轉(zhuǎn)無(wú)疑是降低了效率,但是它脫離于界面與數(shù)據(jù)庫(kù)的完美封裝,使得它的缺點(diǎn)顯然不值得一提。
?
典型的三層結(jié)構(gòu)分為表示(presentation)層,?領(lǐng)域(domain)層,?以及基礎(chǔ)架構(gòu)(infrastructure)層,而微軟的DNA架構(gòu)定義了三個(gè)層:表示層(presentation),業(yè)務(wù)層(business),和數(shù)據(jù)存儲(chǔ)層(data?access),當(dāng)然J2ee?也有它不同的分法不過(guò)都大同小異吧。既然我用.net做的開發(fā),這大三層我無(wú)需多說(shuō)了,根據(jù)我的理解,我對(duì)此做了更詳細(xì)的分層,界面外觀層、界面規(guī)則層、業(yè)務(wù)接口層、業(yè)務(wù)邏輯層、實(shí)體層、數(shù)據(jù)訪問(wèn)層、數(shù)據(jù)存儲(chǔ)層共七層,其具體的調(diào)用如圖1所示:
?
?
?
圖1
?
由圖1可以看出,雖然我將系統(tǒng)的架構(gòu)分為七層,實(shí)際上大的方面來(lái)說(shuō),它就是一個(gè)典型的三層架構(gòu)設(shè)計(jì)思想。單從這個(gè)圖來(lái)看,數(shù)據(jù)的調(diào)用顯得繁瑣而抽象,也許這時(shí)候就會(huì)有人說(shuō),我只是想實(shí)現(xiàn)界面上與用戶交互,然后根據(jù)用戶的請(qǐng)求將數(shù)據(jù)讀出/寫?入數(shù)據(jù)庫(kù)就好了,為什么要做如此復(fù)雜的分層調(diào)用呢?從這個(gè)問(wèn)句中我們也只看到了界面和數(shù)據(jù)庫(kù),也就是說(shuō)從用戶的需求來(lái)說(shuō),就是這兩層而已,但是這里我們首?先要搞清楚的是三層架構(gòu)它主要是為程序員為了實(shí)現(xiàn)部署、開發(fā)、維護(hù)企業(yè)級(jí)數(shù)據(jù)庫(kù)系統(tǒng)而服務(wù)的。如果我們?cè)谥虚g層實(shí)現(xiàn)了對(duì)表示層和數(shù)據(jù)庫(kù)層的完全脫離,其部?署、開發(fā)、維護(hù)系統(tǒng)的費(fèi)用和時(shí)間至少降低到原來(lái)的一半,甚至更多。
?
1.4部署企業(yè)級(jí)數(shù)據(jù)庫(kù)應(yīng)用
?
對(duì)于一個(gè)企業(yè)級(jí)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)上的三層架構(gòu)我是這樣部署的:
?
系?統(tǒng)通過(guò)瀏覽器或應(yīng)用程序客戶端提供與用戶的交互平臺(tái),并向服務(wù)器提交請(qǐng)求(界面外觀層);用戶提交請(qǐng)求后,界面規(guī)則層對(duì)用戶的數(shù)據(jù)按照業(yè)務(wù)邏輯層要求的接?口參數(shù)封裝規(guī)則封裝用戶數(shù)據(jù),然后調(diào)用業(yè)務(wù)接口層對(duì)外提供的相應(yīng)命令接口(界面規(guī)則層),業(yè)務(wù)接口層通過(guò)對(duì)數(shù)據(jù)進(jìn)行解析并分別送入不同的邏輯處理并向用戶?返回處理結(jié)果(業(yè)務(wù)接口層);?對(duì)于數(shù)據(jù)和命令的不同,處理方式也不同,我們將不同的處理方式都?xì)w類,并將接口層傳入的數(shù)據(jù)及命令流入對(duì)應(yīng)處理流程(業(yè)務(wù)規(guī)則層);這時(shí),不同的處理流程?分析數(shù)據(jù)和命令產(chǎn)生出對(duì)應(yīng)的一個(gè)實(shí)體,這個(gè)實(shí)體根據(jù)其本身的屬性和方法以及上層傳入的命令,將數(shù)據(jù)處理為數(shù)據(jù)訪問(wèn)層需要的接口參數(shù),并向數(shù)據(jù)訪問(wèn)層提交訪?問(wèn)數(shù)據(jù)庫(kù)的請(qǐng)求,并向業(yè)務(wù)接口層返回訪問(wèn)結(jié)果(實(shí)體層);數(shù)據(jù)訪問(wèn)層會(huì)將數(shù)據(jù)轉(zhuǎn)化為數(shù)據(jù)庫(kù)可識(shí)別的語(yǔ)句(SQL),并訪問(wèn)數(shù)據(jù)庫(kù)層,訪問(wèn)結(jié)果會(huì)返回給實(shí)體層(數(shù)據(jù)訪問(wèn)層);數(shù)據(jù)庫(kù)層處理上層傳入的SQL,讀寫數(shù)據(jù)庫(kù)內(nèi)置對(duì)象,并根據(jù)其內(nèi)置對(duì)象本身的關(guān)系對(duì)數(shù)據(jù)做進(jìn)一步校驗(yàn)和處理(數(shù)據(jù)庫(kù)層)。這里我所講到的企業(yè)級(jí)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng),不論它是基于B/S應(yīng)用系統(tǒng)上的三層架構(gòu)設(shè)計(jì),還是基于C/S應(yīng)用系統(tǒng)上的三層架構(gòu)設(shè)計(jì),基本上是一樣的,所不同的只是兩種方式常用的數(shù)據(jù)傳輸協(xié)議的不同,B/S應(yīng)用系統(tǒng)設(shè)計(jì)一般數(shù)據(jù)傳遞是通過(guò)HTTP來(lái)完成的,C/S應(yīng)用系統(tǒng)設(shè)計(jì)則更多的是基于TCP/IP協(xié)議來(lái)傳送數(shù)據(jù)的,當(dāng)然,隨著企業(yè)級(jí)應(yīng)用系統(tǒng)對(duì)安全性方面要求的要求越來(lái)越高,更多的防火墻架設(shè)于物理線路之間,C/S應(yīng)用系統(tǒng)的設(shè)計(jì)也越來(lái)越多地趨向于HTTP,典型的方式如:
?
CLIENTàISAPI/CGIàServer?Database;
?
CLIENTàWeb?ServiceàServer?Database;
?
既然提到這兩種方式,我簡(jiǎn)單地提一下它們兩者的區(qū)別及應(yīng)用,它們的不同主要是中間層向客戶端提供服務(wù)的方式不同,一般情況下這兩種方式都需要架設(shè)專門用于受理客戶端請(qǐng)求的Web?Server,很明顯,它更進(jìn)一步地體現(xiàn)了三層架構(gòu)的安全性。中間層基于ISAPI/CGI的方式可以說(shuō)正在被Web?Service方式所取代,這也正是面向?qū)ο笏枷氲倪M(jìn)一步應(yīng)用。ISAPI/CGI向客戶端提供的服務(wù)實(shí)際上是遠(yuǎn)程調(diào)用函數(shù),數(shù)據(jù)一般由程序員自定義結(jié)構(gòu)存儲(chǔ),并基于HTTP與Web?Server交互,而Web?Service向客戶端提供的服務(wù)是遠(yuǎn)程調(diào)用類,常常采用XML存儲(chǔ)數(shù)據(jù),并基于SOAP與Web?Server交互。兩者的優(yōu)劣勢(shì)也很明顯,前者較XML封裝方式,數(shù)據(jù)量小,傳輸速度快,后者因?yàn)閄ML的臃腫速度上來(lái)說(shuō)是它的劣勢(shì),不過(guò)它的安全性以及開發(fā)速度占有明顯得優(yōu)勢(shì)。
?
如果認(rèn)真看圖1中對(duì)各層的描述,不難看出,里面提到了工廠以及構(gòu)造器,它是來(lái)自于設(shè)計(jì)模式中的一種思想。其中業(yè)務(wù)邏輯層的業(yè)務(wù)規(guī)則層、實(shí)體層就是運(yùn)用設(shè)計(jì)模式的思想來(lái)實(shí)現(xiàn)的。
?
2.?設(shè)計(jì)模式思想的應(yīng)用
?
2.1設(shè)計(jì)模式思想概述
?
設(shè)計(jì)模式思想引入企業(yè)級(jí)數(shù)據(jù)庫(kù)系統(tǒng)開發(fā),與傳統(tǒng)的開發(fā)模式可謂是一場(chǎng)革命.設(shè)計(jì)模式之于面向?qū)ο蟮脑O(shè)計(jì)與開發(fā)的作用就有如數(shù)據(jù)結(jié)構(gòu)之于面向過(guò)程開發(fā)的作用一般,其重要性不言而喻。當(dāng)然學(xué)習(xí)設(shè)計(jì)模式的過(guò)程也是痛苦的,對(duì)于GoF的23種設(shè)計(jì)模式要一一學(xué)懂它,無(wú)疑是非常痛苦的。
?
面?向?qū)ο笙到y(tǒng)的設(shè)計(jì)與分析實(shí)際上就是追求的兩點(diǎn):一是高內(nèi)聚,一是低耦合。這也是我們軟件設(shè)計(jì)所要追求的,無(wú)論是OO設(shè)計(jì)中的封裝、繼承、多態(tài),還是我們的?設(shè)計(jì)模式的原則和實(shí)例,都是主要為了追求這兩點(diǎn)。有人說(shuō),我們的系統(tǒng)小,使用設(shè)計(jì)模式會(huì)束縛我們的實(shí)現(xiàn),其實(shí)不然,就如K_Eckel在他所寫的《設(shè)計(jì)模式精解》一書中提到的:設(shè)計(jì)模式體現(xiàn)的是一種思想,而思想是指導(dǎo)行為的一切,理解和掌握了設(shè)計(jì)模式,并不是說(shuō)記住GoF的23種設(shè)計(jì)模式的設(shè)計(jì)場(chǎng)景以及解決方案,而實(shí)際接受的是一種軟件設(shè)計(jì)思想的熏陶和洗禮,等設(shè)計(jì)模式的思想真正融入到你的思想中后,你就會(huì)不自覺得去采用設(shè)計(jì)模式的思想去設(shè)計(jì)你的系統(tǒng),這才是最重要的。因此我并不想重復(fù)地去講述這23種設(shè)計(jì)模式,更不會(huì)拘泥于其中的任何一種,我只是根據(jù)我的經(jīng)驗(yàn)和對(duì)設(shè)計(jì)模式的思想的理解,來(lái)實(shí)現(xiàn)我的業(yè)務(wù)邏輯層的設(shè)計(jì)。
?
我們?cè)诿嫦驅(qū)ο蟮脑O(shè)計(jì)中常常會(huì)遇到一些問(wèn)題,比如說(shuō)為了提高程序的高內(nèi)聚低耦合,我們通常會(huì)抽象出一些類的公共接口以形成抽象基類,這樣我們可以為它派生很多個(gè)子類,通過(guò)申明一個(gè)抽象基類的但被實(shí)例化為指向派生類的對(duì)象,以達(dá)到多態(tài)的目的。然而當(dāng)業(yè)務(wù)復(fù)雜并產(chǎn)生了大量的派生類時(shí),程序員就得記住每一個(gè)派生類的名字然后New出一個(gè)指向它的指針。這就給編寫程序和維護(hù)代碼帶來(lái)了很大的困難,這種情況下我們?nèi)绻罂蛻舳藗魅胍粋€(gè)名稱,我們用一個(gè)switch根據(jù)傳入的名稱來(lái)New一個(gè)子類,這就實(shí)現(xiàn)了中間層的封裝。還有比如我的一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中,有幾百個(gè)表/視?圖等對(duì)象,要對(duì)它們進(jìn)行訪問(wèn),如果只用面向?qū)ο蟮乃枷肴ゲ僮魉鼈?#xff0c;我們需要把這些數(shù)據(jù)庫(kù)對(duì)象都抽象為類,封裝它們自己的屬性和方法,這樣的工作量無(wú)疑是非?常巨大的。于是我利用設(shè)計(jì)模式的思想動(dòng)態(tài)地分類抽象它們,也就是說(shuō),在訪問(wèn)它們之前,才產(chǎn)生具有實(shí)體意義的類。我們可以將幾十個(gè)、幾百個(gè)屬性、方法類同的?數(shù)據(jù)庫(kù)表做成一個(gè)Template?Class,這樣的封裝方式使得代碼量減少到原來(lái)的幾十甚至幾百分之一,而且它最大的好處是脫離了數(shù)據(jù)庫(kù)…?…等等在面向?qū)ο笤O(shè)計(jì)中出現(xiàn)的問(wèn)題我們大都可以用設(shè)計(jì)模式的思想去解決它,就如我們?cè)赾程序中遇到一些比較麻煩的功能時(shí),就會(huì)想到用數(shù)據(jù)結(jié)構(gòu)中的一些算法去解決它一樣。
?
2.2數(shù)據(jù)庫(kù)應(yīng)用中設(shè)計(jì)模式的抽象
?
說(shuō)了這么多,我就舉一個(gè)例子來(lái)說(shuō)明如何在三層架構(gòu)部署的企業(yè)級(jí)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中如何使用設(shè)計(jì)模式:
?
數(shù)據(jù)庫(kù)系統(tǒng)中我們最關(guān)心的就是如何操作數(shù)據(jù)庫(kù)中的那些對(duì)象,我們可以將數(shù)據(jù)庫(kù)中的對(duì)象看作是用來(lái)生產(chǎn)某一種產(chǎn)品的模具,每一種類型的對(duì)象就是一種模具,比如表、視圖、存儲(chǔ)過(guò)程,我們可以將它們當(dāng)作是三種模具,當(dāng)然你可以根據(jù)業(yè)務(wù)及數(shù)據(jù)庫(kù)化分的更細(xì)一點(diǎn),比如單表模具,主從表模具,視圖模具、存儲(chǔ)過(guò)程模具、數(shù)據(jù)庫(kù)函數(shù)模具等等,不夠的你可以去繼續(xù)擴(kuò)展;假使我們現(xiàn)在有一個(gè)工廠,它有好多個(gè)車間,每個(gè)車間只能夠使用一種模具來(lái)生產(chǎn)產(chǎn)品,我們可以分別給它們起名字叫表車間、視圖車間、存儲(chǔ)過(guò)程車間等。當(dāng)用戶想要往USER表中插入一條記錄的時(shí)候,我們可以說(shuō)成是在工廠要在表車間使用表模具生產(chǎn)出一個(gè)叫做USER的產(chǎn)品,然后產(chǎn)品進(jìn)行加工的過(guò)程。那生產(chǎn)并加工這個(gè)產(chǎn)品過(guò)程到底是怎么樣的呢?這里我說(shuō)明一下工廠、車間、模具、產(chǎn)品它們各自的功能以及在一個(gè)產(chǎn)品在產(chǎn)生和加工過(guò)程中所處的環(huán)節(jié),事實(shí)上根據(jù)它們的名字也不難理解。
?
工廠:它要存貯下所有的產(chǎn)品名和車間名以及產(chǎn)品名與車間的多對(duì)一關(guān)系,用戶需要知道自己要生產(chǎn)的產(chǎn)品名字是什么,工廠根據(jù)產(chǎn)品名來(lái)判斷送交給哪個(gè)車間去處理.
?
車間:車間使用它擁有的模具來(lái)產(chǎn)生一個(gè)具體產(chǎn)品
?
模具:模具產(chǎn)生一個(gè)產(chǎn)品對(duì)象
?
產(chǎn)品:進(jìn)行自加工(插入、刪除、修改、查詢等)
?
那么,現(xiàn)在我們來(lái)看看當(dāng)用戶通過(guò)界面層的交互,想對(duì)表USER插入一條記錄的過(guò)程:事實(shí)上用戶并不知道它現(xiàn)在操作表叫做USER,而界面層上的對(duì)象則必須知道當(dāng)前操作界面所對(duì)應(yīng)數(shù)據(jù)庫(kù)表的名字,有了這個(gè)已知條件,界面層調(diào)用業(yè)務(wù)接口層的提供的獲取表信息函數(shù)接口【例如:DataSet?GetTabInfo(string?_tabname);//得到當(dāng)前表的信息】,接口產(chǎn)生一個(gè)工廠,工廠就判斷這個(gè)USER屬于哪個(gè)車間生產(chǎn),將USER轉(zhuǎn)交給表車間,表車間產(chǎn)生一個(gè)表模具對(duì)象,并生產(chǎn)出一個(gè)名叫USER的產(chǎn)品對(duì)象,產(chǎn)品對(duì)象調(diào)用自己的獲取信息函數(shù)【例如:DataSet?GetTabInfo(string?_tabname);//得到當(dāng)前表的信息,并記錄到產(chǎn)品對(duì)象屬性中,實(shí)際上這個(gè)GetTabInfo過(guò)程調(diào)用了數(shù)據(jù)訪問(wèn)層提供的花取字段信息接口】,對(duì)本身做了一次加工,也就是說(shuō)此時(shí)USER這個(gè)產(chǎn)品已經(jīng)擁有了USER表的信息(字段、主鍵等),然后返回到業(yè)務(wù)接口層,業(yè)務(wù)接口層將這個(gè)具體的USER產(chǎn)品返回給界面層,界面層得到產(chǎn)品后,將數(shù)據(jù)填充到產(chǎn)品的屬性(行和列)中,實(shí)際上就是增加一行給字段賦值的過(guò)程,然后再調(diào)用業(yè)務(wù)接口提供的插入數(shù)據(jù)接口【例如:InsertData(DataSet?_tabinfo);】,同樣的,接口產(chǎn)生工廠,工廠找到車間,重新構(gòu)造產(chǎn)品,產(chǎn)品對(duì)象對(duì)本身做插入操作,返回。這就是一個(gè)完整的操作過(guò)程。
?
當(dāng)我真正地了解了GoF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》中的思想后,我突然發(fā)現(xiàn)真正如K_Eckel所說(shuō),經(jīng)過(guò)了一場(chǎng)軟件設(shè)計(jì)思想的洗禮,做系統(tǒng)設(shè)計(jì)時(shí)的思想發(fā)生了質(zhì)的變化,封裝、復(fù)用、多態(tài)、抽象……
?
3.三層架構(gòu)與設(shè)計(jì)模式在Web應(yīng)用系統(tǒng)中的應(yīng)用
?
3.1用c#描述系統(tǒng)架構(gòu)設(shè)計(jì)
?
3.1.1在.net中創(chuàng)建工程
?
1)?首先打開Microsoft?Visual?Stdio?.Net?2003,新建一個(gè)C#項(xiàng)目asp.net?Web應(yīng)用程序,如圖2所示:
?
?
?
圖2
?
2)?在新生成的解決方案中加入以下類庫(kù):
?
???????GlobalDataTypeLayer:公用參數(shù)層
?
???????BusinessLayer:業(yè)務(wù)邏輯層(可以將里面的四層全部分開,建成類庫(kù))
?
???????DataAccessLayer:數(shù)據(jù)訪問(wèn)層,為了更好的擴(kuò)展,我在代碼表現(xiàn)形式上只將該層從業(yè)務(wù)邏輯層分離出來(lái)
?
界面規(guī)則層可直接置于asp.net項(xiàng)目中,因?yàn)樗墙缑嫱庥^層的基類,在一個(gè)命名空間中使用比較方便。各層之間互相的引用聯(lián)系是這樣的,首先要將GlobalDataTypeLayer命名空間在其它各層全部引用,UserRoleLayer命名空間中再引用BusinessLayer,BusinessLayer再引用DataAccessLayer。引用事例圖如圖3所示:
?
?
?
圖3
?
3.1.2應(yīng)用于系統(tǒng)層次結(jié)構(gòu)調(diào)用過(guò)程以及類的代碼實(shí)現(xiàn)
?
3.1.2.1界面表示層類圖(如圖4)
?
?
?
圖4
?
圖2展示的是用戶界面表示層的類圖結(jié)構(gòu),圖中顯示了共三個(gè)類,WebForm?Class與PrintControl?Class都屬于界面外觀層。
?
WebForm?Class這不僅僅表示一個(gè)類,而表示一批類,因?yàn)橐话闱闆r下與用戶交流的類的屬性及操作都大同小異,我們可以從一個(gè)基類中派生,以便于編程和管理。當(dāng)然如果有一些類差別比較大,可以重新概造相應(yīng)的基類,重新派生,界面層的擴(kuò)展可以很靈活地通過(guò)增加基類來(lái)實(shí)現(xiàn)。
?
PrintControl?Class?:?打印控制類,主要以客戶端腳本來(lái)實(shí)現(xiàn),不與服務(wù)器進(jìn)行數(shù)據(jù)交互,打印預(yù)覽之前,打印數(shù)據(jù)應(yīng)由WebForm類提交給PrintControl。
?
PageBase?Class?這個(gè)類屬于界面規(guī)則層,它是WebForm的基類,事實(shí)上界面外觀與界面規(guī)則可以放在一個(gè)命名空間中,它可以是一個(gè)類,也可以是多個(gè)類,業(yè)務(wù)的復(fù)雜程度也決定了PageBase?Class的擴(kuò)展,根據(jù)不同的需求可以構(gòu)造相應(yīng)的WebForm基類來(lái)滿足業(yè)務(wù)需求。實(shí)現(xiàn)基類部分代碼見附錄A.
?
3.1.2.2業(yè)務(wù)邏輯層類圖(如圖5)
?
?
?
圖5
?
圖5展示了復(fù)雜的業(yè)務(wù)邏輯層調(diào)用過(guò)程,其中主要展示的類有六個(gè)類,不包含派生的子類。
?
ParamData?Class?公用參數(shù)類,這個(gè)類事實(shí)上并不屬于三層架構(gòu)中的任何層,我單獨(dú)將其定義為公用參數(shù)層,它與三層架構(gòu)中的任何一個(gè)類都息息相關(guān),實(shí)現(xiàn)代碼見附錄A
?
InterfaceImpl?Class?是業(yè)務(wù)邏輯層向界面表示層提供的接口類,數(shù)據(jù)由界面規(guī)則層封裝傳入,對(duì)外接口函數(shù)根據(jù)業(yè)務(wù)需求可以增加。該類的所有函數(shù)實(shí)現(xiàn)基本都很類似,我這里列出數(shù)據(jù)庫(kù)連接和一個(gè)SaveData的代碼實(shí)例,見附錄A
?
ClassBuilderFactory?Class?工廠類,它的作用是根據(jù)接口類傳入的數(shù)據(jù)找到對(duì)應(yīng)的生產(chǎn)構(gòu)造部件(ClassBuilder),這里很重要的是包含了一個(gè)簡(jiǎn)單的map,該結(jié)構(gòu)在連接數(shù)據(jù)庫(kù)里進(jìn)行實(shí)例化,代碼實(shí)現(xiàn)見附錄A
?
ClassBuilder?Class?這是構(gòu)造部件的抽象基類,其下可以根據(jù)業(yè)務(wù)的需求擴(kuò)展很多的構(gòu)件器,可以用工廠的模式理解其為構(gòu)件車間,我這里派生的構(gòu)件器有:
?
TableClassBuilder:實(shí)體表構(gòu)件器
?
ViewClassBuilder:視圖構(gòu)件器
?
ProcedureClassBuilder:存儲(chǔ)過(guò)程構(gòu)件器
?
OtherClassBuilder:其它構(gòu)件器
?
基類和實(shí)體表構(gòu)件器的代碼實(shí)現(xiàn)見附錄A
?
EntityData?Class?這是實(shí)體類的抽象基類,其下也可以根據(jù)業(yè)務(wù)的需求擴(kuò)展派生實(shí)體,前面我提到過(guò)我們的構(gòu)件器與實(shí)體類是一一對(duì)應(yīng)的,一個(gè)構(gòu)件車間只能夠生產(chǎn)一類產(chǎn)品。那么對(duì)應(yīng)的派生實(shí)體就有:
?
TableEntityData:表實(shí)體
?
ViewEntityData:視圖實(shí)體
?
ProcedureEntityData:存儲(chǔ)過(guò)程實(shí)體
?
OtherClassEntityData:其它實(shí)體(這個(gè)實(shí)體的自我加工可以靈活定義)
?
實(shí)體抽象基類及表實(shí)體的代碼實(shí)現(xiàn)見附錄A
?
DataAccess?Class?是數(shù)據(jù)訪問(wèn)層的數(shù)據(jù)訪問(wèn)類,這里才真正實(shí)現(xiàn)了數(shù)據(jù)庫(kù)連接,數(shù)據(jù)庫(kù)讀寫等,將用戶的數(shù)據(jù)構(gòu)造成sql語(yǔ)句與數(shù)據(jù)庫(kù)交互。如果想在整個(gè)系統(tǒng)中兼容各種數(shù)據(jù)庫(kù),那么可以將它抽象為數(shù)據(jù)訪問(wèn)的抽象基類,可以去派生OracleDataAccess,SqlServerDataAccess,AccessDataAccess等等,它們的屬性和方法基本上都是相同的,只是具體方法中的實(shí)現(xiàn)有所不同而已,訪問(wèn)Oracle部分實(shí)例代碼見附錄A。
?
在實(shí)例化并填充工廠MAP的時(shí)候用XML存儲(chǔ)構(gòu)件的產(chǎn)品名與產(chǎn)品類型名的多對(duì)一關(guān)系,XML結(jié)構(gòu)見附錄A。
?
3.1.2.3?數(shù)據(jù)庫(kù)層
?
數(shù)據(jù)庫(kù)層指的主要是系統(tǒng)采用的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS),在?整套企業(yè)級(jí)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中,它是最重要的一環(huán),其中主要的對(duì)象有表、視圖、存儲(chǔ)過(guò)程、函數(shù)、觸發(fā)器等,數(shù)據(jù)的許多處理都應(yīng)該由數(shù)據(jù)庫(kù)本身去完成,例如將?復(fù)雜的查詢或者數(shù)據(jù)寫入,都封裝為存儲(chǔ)過(guò)程和函數(shù),將數(shù)據(jù)寫入前后要進(jìn)行的附加操作用觸發(fā)器實(shí)現(xiàn)等等。對(duì)于表的創(chuàng)建一般應(yīng)以數(shù)據(jù)庫(kù)原理的第三范式規(guī)范來(lái)創(chuàng)?建,允許一定的冗余。表及視圖的創(chuàng)建規(guī)范直接影響到代碼編寫的難易度。
?
到?這里,關(guān)于三層架構(gòu)與設(shè)計(jì)模式思想部署企業(yè)級(jí)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開發(fā)應(yīng)趨于完整了,我想主要向大家展示的實(shí)際上就是一種程序設(shè)計(jì)的思想,不管是三層架構(gòu)還是設(shè)?計(jì)模式,它們都是軟件工程面向?qū)ο笏枷氲耐耆w現(xiàn),目前,我們國(guó)家軟件業(yè)相對(duì)來(lái)說(shuō)是很落后的,關(guān)鍵的問(wèn)題是軟件企業(yè)的急功近利和程序員思想還停留在結(jié)構(gòu)化?思想上,不能說(shuō)你在程序中用的是類就說(shuō)你的思想是面向?qū)ο?#xff0c;也不是說(shuō)你會(huì)使用java編寫程序,就說(shuō)自己懂得面向?qū)ο?#xff0c;希望我和大家能一起進(jìn)步,直正理解面向?qū)ο蟆?/span>
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/andyWqh520/p/3828798.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的三层架构与设计模式思想部署企业级数据库业务系统开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 201671010434王雯涵 实验四附
- 下一篇: Windows Phone 8初学者开发