




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、設(shè)計模式&重整技術(shù)運(yùn)用實(shí)例作者:點(diǎn)空間陳閾生email: bnjcel23edirect168 com日期:2003/09/06設(shè)計電腦系統(tǒng),最困難的部分是什麼?也許你可以找出一大堆的答案,但真正最 困難的部分是面對系統(tǒng)功能的改變,這是因?yàn)槲覀儫o法去預(yù)知這些改變。但或許 你會說,那就盡量保持彈性,話雖如此,但我們?nèi)绾沃浪T谑颤N地方保持彈性? 但如果你的系統(tǒng)無法去應(yīng)付這些改變,那麼就只有走向重寫一途,這無疑是一件 讓人沮喪的事。在面對這個問題,我們'必須學(xué)會用設(shè)計模式去思考,如果系統(tǒng) 的設(shè)計已經(jīng)僵化了,我們就讓它柔軟下來,如果柔軟不下來,就把它凍結(jié)起來, 如果原來設(shè)計彈性就很好
2、,我們就繼續(xù)擴(kuò)充功能,沒有解決不了的事,以下我們 翠個例子來說明這個想法。首先,我們從一個設(shè)計模式說起:facade外觀模式。我們來談?wù)勥@個模式,這 個模式的用途是將一個子系統(tǒng)內(nèi)部的衆(zhòng)多物件統(tǒng)一起來,產(chǎn)生新的介面出來。這 讓我想到我們屮國有句成語叫:老幹新枝。這個意義是,老幹已經(jīng)失去了活力, 但為了生存下去,必須產(chǎn)生新的枝芽,問問這跟一個已經(jīng)僵化的系統(tǒng)一樣,我們 無法期望從原來的枝長出葉了,所以只好另長新芽。如果一個系統(tǒng)己經(jīng)糾成一團(tuán),如左圖般的狀態(tài),再繼續(xù)擴(kuò) 充功能,或更動系統(tǒng)功能,那無疑的是雪上加霜,加速系 統(tǒng)的走向死亡之路。由於系統(tǒng)內(nèi)部的物件交互影響,只要 移動部分的功能,client端的
3、使用介面勢必要跟著改變, 繼續(xù)使用這樣的 系統(tǒng)結(jié)構(gòu),終究冇 一天會土崩瓦解。重新去調(diào)整這個致命的缺點(diǎn),又跟重新改寫沒有兩樣,常常這樣讓人陷入進(jìn)退兩難的窘境。如果我們可以用設(shè)計模式去思考解決問題,如右圖將原系統(tǒng)視為一個了系統(tǒng),使 用facade這個樣式,重新產(chǎn)生使用介面,將這混亂的局面控制,不再像癌癥一 樣繼續(xù)擴(kuò)散開來,內(nèi)部的調(diào)整不再影響client的使用介面,那麼就叮以讓系統(tǒng)取得一個擴(kuò)充功能的契機(jī)。系統(tǒng)控充功能與內(nèi)部結(jié)構(gòu)的改善,這是兩個不同的方 向,千萬不要攪在一起,也不要同時去改變,這樣會使問題更加的複雜, 接下來,我們來探討一下什麼叫重整? martin fowler於書中定義它是一種在
4、不改變代碼外在行為的前提下對代碼做出修改,以改進(jìn)代碼的內(nèi)部結(jié)構(gòu)的過程。 如果說重整的目的不在於對既有的代碼增加新功能,而只是不影響程式既有功能 及止確的執(zhí)行下,改善程式代碼。那麼對許多人而言,讓他們感到和當(dāng)疑惑的 是,這種行為是否能帶來任何的益處?重整如果只是改善內(nèi)部結(jié)構(gòu),那顯然是無 助於增加效益,所以重整的目的勢必與往後的系統(tǒng)擴(kuò)充功能產(chǎn)生緊密的關(guān)聯(lián)。俗 語說:休息是為走更遠(yuǎn)的路,所以沒有重整,也就沒有更遠(yuǎn)的路。而本篇重點(diǎn)是 在改善結(jié)構(gòu)跟擴(kuò)充功能這兩個想法緊密的結(jié)合在一起。也就是說在改變現(xiàn)有結(jié)構(gòu) 之後,進(jìn)行系統(tǒng)功能擴(kuò)充,根據(jù)現(xiàn)有的結(jié)構(gòu)加以改善,以符合擴(kuò)充的需要。試想, 如果沒有新的需求產(chǎn)生,需
5、要擴(kuò)充功能,乂何必大費(fèi)周章的去進(jìn)行重整呢?但是 從木篇的範(fàn)例中,有些範(fàn)例雖然未擴(kuò)展功能,但經(jīng)過使用樣式設(shè)計進(jìn)行重整結(jié)構(gòu) 的改善,幾乎已經(jīng)叮以看見擴(kuò)展新的功能的曙光,這是重整帶來最大的好處。俗語說:做衣容易,改衣難。這說明一件事,雖然做衣服跟改衣服,用的是同樣 的技術(shù),但卻是不同的思維,所以變成了會做衣服卻不一定會改衣服。對設(shè)計系 統(tǒng)而言,系統(tǒng)中任何一個變動,就像改衣服一樣,學(xué)習(xí)克服這些變動,才能快速 的反應(yīng)變動。近年來軟體工程的思維傾向貼近客戶需求,擁抱改變,但這不光是 口號而已,在這個思潮下,背後必須冇強(qiáng)而冇力的設(shè)計技術(shù)及思考模式所支撐, 因此學(xué)習(xí)這些基木技術(shù)及不斷的磨練你的思考模式,才能去
6、符合這樣的耍求。木 篇就是基於這樣的想法,將設(shè)計模式與重整兩個重要的基本技術(shù)加以結(jié)合運(yùn)用, 實(shí)現(xiàn)系統(tǒng)面對改變時,如何去反應(yīng)變動,及如何讓系統(tǒng)保持適當(dāng)?shù)膹椥?。底下,對木篇所提供的?shí)作範(fàn)例,作簡單扼要的說明:範(fàn)例一:運(yùn)用 observer察者模式解開單元z間的耦合,是重整的典型範(fàn)例,本範(fàn)例著眼於系統(tǒng)結(jié)構(gòu)改善,並未擴(kuò)充新功能。範(fàn)例二:運(yùn)用template method樣式設(shè)計資料庫的異動交易控制,這個範(fàn)例架 構(gòu)在原系統(tǒng)上面,將原來程式碼加以凍結(jié),並擴(kuò)展新功能。範(fàn)例三:運(yùn)用factory工廠模式設(shè)計多人使用的權(quán)限控制,這個範(fàn)例使用替代 的方式,在不改變原有功能的前提增加了系統(tǒng)的彈性。範(fàn)例一運(yùn)用obse
7、rver觀察者模式解開單元之間的耦合 作者:陳閾生emai1: bruccl23cdircct168 com【解決問題】在delphi的物件中,teorm是一個很扌倉眼的角色,因?yàn)樵谝粋€form當(dāng)中,我們可以輕易的結(jié) 合許多不同的物件一起工作,幾乎是無所不能,但是在比較複雜的系統(tǒng)中,我們必須根據(jù)不同的 功能,切割放在不同的form ±ifri ,或者說是在不同單元當(dāng)中。當(dāng)一個系統(tǒng)存在許多不同單元 之後,我們更如何去讓這些單元可以和互合作?使用uses可以將兩個不同單元視為-個單元來 使用,但遺憾的是,這種設(shè)計方式往往會造成單元z間的耦合性過高,當(dāng)一個單元變動z後,往 往其他的單元也會
8、跟著受影響,而整個系統(tǒng)也就因此牽一髮而動全身了。常然,我們可以透過使用介面讓這個問題不至於過度的惡化,但仍無法確實(shí)的解決這個致命的糾 纏。因?yàn)橥高^使用介面來運(yùn)作,仍然必須uses這個單元,當(dāng)這個単元被取消z後,仍然會影響 其他單元的運(yùn)作?!久媾R問題】也許,此刻你的程式已經(jīng)陷入這樣致命的糾綁當(dāng)中,我們要如何才能去解開這個結(jié)呢?【運(yùn)用技術(shù)】木範(fàn)例將連用observer觀察者樣式,來解決單元z間的糾纏不清。首先我們先來看看這個觀察 樣式定義:觀察者模式定義物件間的一對多的相互關(guān)係,使得一個物件改變時,其他相關(guān)物件 皆可獲得通知並自動更新。這個模式裡面,會有一個觀察者,及一個以上的被觀察者,當(dāng)觀察 者
9、的狀態(tài)改變時,被觀察者被主動的告之,而觀察者負(fù)責(zé)通知,被觀察者卻不用知道觀察者是 誰。從理解一個抽象槪念的,到運(yùn)用在解決問題上面,過程通常不是那麼的容易。根據(jù)觀察的樣式提 供的概念,其實(shí)delphi這個rad已經(jīng)幫我們設(shè)計許多功能強(qiáng)大的物件,所以重要的是,我們?nèi)?何去運(yùn)用這個概念去解決問題,要把焦點(diǎn)放在解決問題上面。觀察者模式,冇點(diǎn)類似window裡而的訊息傳遞機(jī)制,如果我們要實(shí)作這樣的機(jī)制,那麼必須要 有一個可以儲存這些訊息及事件的容器型物件。在delphi中有許多現(xiàn)成的物件,你無須費(fèi)心的 去設(shè)計這樣的物件,只耍找出可以賁踐逍樣想法的物件即可,本範(fàn)例中,我們運(yùn)ju tactionlist 來
10、實(shí)現(xiàn),tactionlist是一個事件串列,現(xiàn)在就看我們?nèi)绾紊朴眠@個物件,去達(dá)到訊息傳遞的 目的了。在下而的範(fàn)例中,我們將實(shí)作一個橫跨整個系統(tǒng)的觀察者樣式,解開單元之間的耦合問題。【實(shí)作範(fàn)例】第一步,建立一個tdatamodule,並在datamodule 1上面放置一個tactionlist的物件。第二步,分別建立兩個tform, forml及form2 ,在eorml, form2各放一個tedit以供測試。第三步,在 tdatamodule 增加一個屬性,myvaluc: slringo第四步,在tactionlist增加一個taction物件,並寫入控制事件:procedure tda
11、tamodulel. actionlexecute(sender: tobject);beginif formlonil then forml. edill, text:=myvalue;end;第五步,在form2的editl的onkeypress寫入:procedure tform2. editlkeypress(sender: tobject; var key: char); begindatamodule 1. myvalue:=editl. text;datamodule 1. actionl. execute;end;第六步,在forml啟動form2,然後在form2的eedit
12、l輸入資料,此時可見forml. editl同步 收到訊息了。從這個範(fàn)例中,可以將fonn2視為是一個觀察者,而forml是一個被觀察者,當(dāng)form2的tedit 的值改變後,透過事件通知,改變t forml的tedit,然而fonn2並m uses forml ,也不知道 forml的存在,所以即使forml消失了,仍然不會影響form2的運(yùn)作。所以,從這個運(yùn)作架構(gòu)屮,我們可以依系統(tǒng)變動的需求,不斷的增加控制事件,卻不會影響單元 z間的關(guān)係?!窘Y(jié)論】在一個大的系統(tǒng)裡血,控制單元z間的耦合性非常重要,以上述的範(fàn)例來說,不論系統(tǒng)如何改變, 各個單元都可以維持正常的運(yùn)作,既相互合作又不會相互影響,
13、其變動姓被冇效的控制在一個岀 件串列當(dāng)中,當(dāng)單元變動時,我們很容易追蹤,且不會擴(kuò)散到整個系統(tǒng)。範(fàn)例二運(yùn)用template method樣式設(shè)計資料庫的異動交易控制作者:陳閾生emai 1: brucel23eclirect 168 com【解決問題】什麼是異動交易控制?簡單的說,就是如何確保在資料改變的過程,可以順利的完成,異動交易 控制最主要的著眼點(diǎn)在於對交易失敗的控制,試想-個交易,基於某種不可預(yù)期的原因造成程式 產(chǎn)生錯誤,中途被迫終止交易,那z前已經(jīng)改變的資料算不算數(shù)?如果不算數(shù),那z前已經(jīng)交易 的資料怎麼辦呢?眾例來說,i張進(jìn)貨單可能要同時更新單據(jù)檔及庫存檔,如果中途火敗,可能造成單據(jù)
14、檔有資料 而庫存檔沒有更新,要如何才能避免這種嚴(yán)重的錯誤呢?那就是必須進(jìn)行異動交易的控制,在一 個異動交易控制中,只耍有一筆交易失敗,那麼之前所有交易的資料,將被還原至交易之前。在delphi的connection物件已經(jīng)提供了良好的控制程序。以tadoconnection為例,它的語法 格式如下:try/開始進(jìn)行交易控制adoconnectionl. begintrans;/寫入您的交易程序/將交易資料實(shí)際寫入資料障 adoconnectionl. comini ttr a ns;except/如果發(fā)生意外,將z前所有已交易資料還原 adoconnectionl. rollbacktrans
15、;end;從上面的控制結(jié)構(gòu)來看,它是將一個交易程序帶入交易控制z中,那麼也就是說,如果你原先寫 的交易程序如果沒有做這樣的控制,只耍加入這樣的控制程序,就可以進(jìn)行異動交易。但在程式 重整的技術(shù)中,有一點(diǎn)必須耍注意,那就是儘量不要去更動現(xiàn)有的程式,因?yàn)橐坏└鼊映淌?,?必須重新作測試,因此在不更動現(xiàn)有的程式的前提下,我們要如何去修改程式,讓程式具有異動 交易控制能力呢?【面臨的問題】雖然delphi已經(jīng)有了很好的解決方式,但是對一些已經(jīng)寫好的交易程式,我們在不變動原有的 程式碼,如何進(jìn)行功能的擴(kuò)充呢?【使用技術(shù)】這個案例,我們將利用到巫整技術(shù)的概念及樣式設(shè)計來解決適個問題。範(fàn)例中我們會用到 te
16、mplate method這個樣式來設(shè)計一個程序,什麼叫template method ?它的定義如下:在父類別中定義一個演算法的骨架,但將一些步驟延遲到其子類別中執(zhí)行。套 句話說,一個人犯罪是要坐牢的,這個犯罪要坐牢就是一個樣版,至於做幾年 的牢,要看當(dāng)時犯了什麼罪才來決定。這樣的說法還是很抽象,我們進(jìn)一步說明這個抽象的槪念的運(yùn)用時機(jī):利用template method可以定義一些共用的演算法,差異性部分則由子類別去實(shí) 作,讓一些有差異性的子類別,擁有共同的演算法,如此則程式不但有彈性, 且易於維護(hù)。我們應(yīng)該可以想像,異動交易控制就是一個演算法,這個演算法會被利用在許多需要控制異動交 易的地
17、方,每個異動交易的內(nèi)容是不一樣的,但異動控制的運(yùn)算卻是一致的template method這 個樣式的重點(diǎn)乃在區(qū)分變與不變的地方,將不變的部分寫成骨架,將變的部分保留起來,對於一 個異動交易控制程序來說,異動交易內(nèi)容是變動的部分,而異動控的運(yùn)算是不變的部分?!緦?shí)作範(fàn)例】在這個的範(fàn)例中,我們並沒有使用類別的繼承層級,但卻是運(yùn)用了另一種方式去實(shí)現(xiàn)這個差異性 的部分,只要是考慮與現(xiàn)有程式的協(xié)調(diào)問題,至於使用類別層級的方式,在結(jié)論中亦有說明其做 法。首先,在tadoconnect所在的控制模組中,增加一個程序,這個程凈跟上述的異動控制結(jié)構(gòu)差不 多,只加入了一個trandproc的事件,在這個事件中,我
18、們將允許執(zhí)行一些差異的運(yùn)算,因此很 簡單的,我們已經(jīng)將template method這個様式運(yùn)用在程式設(shè)計屮了。function tdmconnection. runtrans( transproc:tnotifyevent):boolean;begintryadoconnectionl begintrans;transproc(self);adoconnectionl committrans;result:=true;exceptadoconnectionl rollbacktrans;result:二false;end;end;接下來,我們來看一下,如何運(yùn)用這個樣式來解決問提呢,假設(shè)你有一
19、-個異動程序是這樣:/異動程序procedure tform1. rename(sender: tobject);varn:integer;beginadodatasct1 first;for n:=0 to adodatasetlrecordcountt do beginif adodataset 1 '使用者'二bruce' the n beg in adodatasetl edit;adodatasetl異動,:=checkboxl. checked; adodatasetl post;end;adodatasetl. next;end;end;現(xiàn)在,我們要為這個
20、異動程序增加異動控能力,只要增加這樣的一個程序就可以了:procedure tforml. buttonlclick(sender: tobject);beginif not dmconnection.runtrans( rename )then application. messageboxc 執(zhí)彳亍失敗','錯誤',0);end;把現(xiàn)有的異動程序常成一個參數(shù),傳至runtrans這個異動交易控制的運(yùn)算中,就大功告成。論】【結(jié) 這個範(fàn)例連用template method樣式,避免修改已經(jīng)完成的程式,同時乂可以增加系統(tǒng)的功能。 當(dāng)然這個範(fàn)例,也可以運(yùn)用類別繼承的方式來實(shí)
21、現(xiàn),其寫作的方式,與上述的範(fàn)例,亦相去無幾, 原事件改成宣告一個虛擬的程序,並在子類別中去實(shí)作這個程序即可,運(yùn)川的概念是一樣的,這 正是所謂戲法人人會變,巧妙各有不同,融會貫通之後就可以運(yùn)用自如了。範(fàn)例三運(yùn)用factory工廠模式設(shè)計多人使用的權(quán)限控制作者:陳閾生emai1: bruccl23cdircctl68 com【解決問題】在一個多人使用的系統(tǒng)中,根據(jù)不同的使用者,必須設(shè)計出不同的使用權(quán)限,要設(shè)計這樣的權(quán)限 控管機(jī)制,很顯然相當(dāng)複雜而h繁瑣。因此,如何使用一個簡單乂容易維護(hù)的方式進(jìn)行系統(tǒng)設(shè)計? 在軟體設(shè)計領(lǐng)域裡面,簡單就是美,這是在靈活塑模裡面的一個宣言,追求簡單,英實(shí)不簡單, 同様?shù)?/p>
22、一個問題,有千百種解法,如何使用一個簡單又有彈性的設(shè)計,是程式設(shè)計者追求的極致, 木範(fàn)例的重點(diǎn)就是要具間實(shí)踐這個目標(biāo)。【面臨問題】對已經(jīng)寫好的程式,我們不希望修改,因此如何以擴(kuò)充功能的方法,將此權(quán)限控制的功能加入系統(tǒng)?【運(yùn)用技術(shù)】在重整技術(shù)中,有一個朿耍的原則,就是不耍去更動已經(jīng)設(shè)計好的程式,因此我們將設(shè)計-個即 插即用的單元,為系統(tǒng)擴(kuò)充多人使用的控管機(jī)制,因此在這個桶想下,我們運(yùn)用factory工廠 模式的設(shè)計樣式來實(shí)現(xiàn)這個設(shè)計。什麼是factory工廠模式?工廠模式可以依實(shí)際需要,適時的產(chǎn)牛我們所需要的物件,在於無 法確定使用何種物件的時候非常好用。在delphi屮已紳內(nèi)建許多不同類型的物
23、件,我們可以隨 手取川,所以設(shè)計一個工廠模式可以說非常的簡單。物件工廠本身有許多變形,如工廠方法 (factory method),抽象工廠(abstract factory ),雛形(prototype)等等皆是。現(xiàn)在,我們假設(shè)每一個使用者登入時,會對應(yīng)到一個權(quán)限物件,然後針對這個物件去設(shè)計使用 權(quán)限即可。換句話說,也就是說讓不同的使用者對應(yīng)到不同的物件上面,再連用工廠模式,根 據(jù)不同的使用者,自動產(chǎn)生不同的物件,如此便可達(dá)到權(quán)限控制的目的。當(dāng)然,控制使用的權(quán)限,依控管方式不同,會方法有很多種,卜面範(fàn)例將提供其中一種控管方法。【範(fàn)例實(shí)作】第一步:使用一個tdatamodule來存放一些tmainmenu物件。第二步:tmainmenu的數(shù)量根據(jù)使用者的多寡而定。第三步:增加一(sltactionlist物件,將所有可執(zhí)行程式統(tǒng)一交由tactionlist控管。第四步:根據(jù)不同的使用權(quán)限,將tactionlist裡面的taction指定至各個不同的tmainmenu裡 面的action屬性。以上四個步驟,在delphi裡面都可以視覺化的完成,除了 taction袒面的"execute必須動手 寫入欲執(zhí)行的功能z外。至此,我們已經(jīng)把準(zhǔn)備對應(yīng)到使用者的權(quán)限物件tmainmenu都設(shè)計完成了,接下來只耍根據(jù)不 同的使
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微特電機(jī)在高精度伺服系統(tǒng)中的應(yīng)用考核試卷
- 有機(jī)合成原料在綠色建筑材料的創(chuàng)新開發(fā)趨勢預(yù)測分析預(yù)測考核試卷
- 冷凍飲品企業(yè)的品牌維權(quán)與法律事務(wù)考核試卷
- 木質(zhì)素在土壤改良劑中的作用考核試卷
- 外貿(mào)生鮮類合同范本
- 梁板安裝合同范本
- 檔案提成合同范本
- 外墻水性氟碳漆合同范本
- 金融門面轉(zhuǎn)讓合同范本
- 水管改造施工合同
- 初中中考語文記敘文閱讀訓(xùn)練訓(xùn)練及答案
- 《船藝與船舶操縱》考試復(fù)習(xí)題庫200題(??迹?/a>
- 圍手術(shù)期高血壓患者管理專家共識
- 中國城市人口排名表
- 人教版六年級下冊數(shù)學(xué)(全冊)同步隨堂練習(xí)一課一練
- GB/T 2573-2008玻璃纖維增強(qiáng)塑料老化性能試驗(yàn)方法
- GB/T 1265-2003化學(xué)試劑溴化鈉
- 工程建設(shè)項(xiàng)目管理培訓(xùn)教材課件
- 11-化學(xué)動力學(xué)基礎(chǔ)-2-考研試題資料系列
- 《簡愛》課本劇劇本
- 社區(qū)獲得性肺炎臨床路徑
評論
0/150
提交評論