资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
設計模式設計模式beginif Form1nil then Form1.Edit1.text:=myValue;end;第五步,在 Form2 的 Edit1 的 OnKeyPress 寫入:procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);beginDataModule 1.myValue:=Edit1.text;DataModule 1.Action1.Execute;end;第六步,在 Form1 啟動 Form2,然後在 Form2 的 Eedit1 輸入資料,此時可見 Form1.Edit1 同步收到訊息了。從這個範例中,可以將 Form2 視為是一個觀察者,而 Form1 是一個被觀察者,當 Form2 的TEdit 的值改變後,透過事件通知,改變了 Form1 的 TEdit,然而 Form2 並無 USES Form1 ,也不知道 Form1 的存在,所以即使 Form1 消失了,仍然不會影響 Form2 的運作。所以,從這個運作架構中,我們可以依系統變動的需求,不斷的增加控制事件,卻不會影響單元之間的關係。【結 論】在一個大的系統裡面,控制單元之間的耦合性非常重要,以上述的範例來說,不論系統如何改變,各個單元都可以維持正常的運作,既相互合作又不會相互影響,其變動姓被有效的控制在一個事件串列當中,當單元變動時,我們很容易追蹤,且不會擴散到整個系統。範例二運用運用 TemplateTemplate MethodMethod 樣式設計資料庫的異動交易控制樣式設計資料庫的異動交易控制作者:陳國生 Email: bruce123edirect168.com【解決問題】什麼是異動交易控制?簡單的說,就是如何確保在資料改變的過程,可以順利的完成,異動交易控制最主要的著眼點在於對交易失敗的控制,試想一個交易,基於某種不可預期的原因造成程式產生錯誤,中途被迫終止交易,那之前已經改變的資料算不算數?如果不算數,那之前已經交易的資料怎麼辦呢?舉例來說,一張進貨單可能要同時更新單據檔及庫存檔,如果中途失敗,可能造成單據檔有資料而庫存檔沒有更新,要如何才能避免這種嚴重的錯誤呢?那就是必須進行異動交易的控制,在一個異動交易控制中,只要有一筆交易失敗,那麼之前所有交易的資料,將被還原至交易之前。在 Delphi 的 Connection 物件已經提供了良好的控制程序。以 TAdoConnection 為例,它的語法格式如下:try/ 開始進行交易控制adoconnection1.BeginTrans;/ 寫入您的交易程序./ 將交易資料實際寫入資料庫adoconnection1.CommitTrans;except/ 如果發生意外,將之前所有已交易資料還原adoconnection1.RollbackTrans;end;從上面的控制結構來看,它是將一個交易程序帶入交易控制之中,那麼也就是說,如果你原先寫的交易程序如果沒有做這樣的控制,只要加入這樣的控制程序,就可以進行異動交易。但在程式重整的技術中,有一點必須要注意,那就是儘量不要去更動現有的程式,因為一旦更動程式,就必須重新作測試,因此在不更動現有的程式的前提下,我們要如何去修改程式,讓程式具有異動交易控制能力呢?【面臨的問題】雖然 Delphi 已經有了很好的解決方式,但是對一些已經寫好的交易程式,我們在不變動原有的程式碼,如何進行功能的擴充呢?【使用技術】這個案例,我們將利用到重整技術的概念及樣式設計來解決這個問題。範例中我們會用到Template Method 這個樣式來設計一個程序,什麼叫 Template Method ?它的定義如下:在父類別中定義一個演算法的骨架在父類別中定義一個演算法的骨架,但,但將一些步驟延遲到其子類別中執行。套將一些步驟延遲到其子類別中執行。套句話說,一個人犯罪是要坐牢的,這個犯罪要坐牢就是一個樣版,至於做幾年句話說,一個人犯罪是要坐牢的,這個犯罪要坐牢就是一個樣版,至於做幾年的牢,要看當時犯了什麼罪才來決定。的牢,要看當時犯了什麼罪才來決定。這樣的說法還是很抽象,我們進一步說明這個抽象的概念的運用時機:利用利用 TemplateTemplate MethodMethod 可以定義一些共用的演算法,差異性部分則由子類別去可以定義一些共用的演算法,差異性部分則由子類別去實作,讓一些有差異性的子類別,擁有共同的演算法,如此則程式不但有彈性,實作,讓一些有差異性的子類別,擁有共同的演算法,如此則程式不但有彈性,且易於維護。且易於維護。我們應該可以想像,異動交易控制就是一個演算法,這個演算法會被利用在許多需要控制異動交易的地方,每個異動交易的內容是不一樣的,但異動控制的運算卻是一致的。Template Method 這個樣式的重點乃在區分變與不變的地方,將不變的部分寫成骨架,將變的部分保留起來,對於一個異動交易控制程序來說,異動交易內容是變動的部分,而異動控的運算是不變的部分。【實作範例】在這個的範例中,我們並沒有使用類別的繼承層級,但卻是運用了另一種方式去實現這個差異性的部分,只要是考慮與現有程式的協調問題,至於使用類別層級的方式,在結論中亦有說明其做法。首先,在 TAdoconnect 所在的控制模組中,增加一個程序,這個程序跟上述的異動控制結構差不多,只加入了一個 TrandProc 的事件,在這個事件中,我們將允許執行一些差異的運算,因此很簡單的,我們已經將 Template Method 這個樣式運用在程式設計中了。function TDmConNection.RunTrans( TransProc:TNotifyEvent):boolean;begintryadoconnection1.BeginTrans;transProc(self); adoconnection1.CommitTrans;result:=true;exceptadoconnection1.RollbackTrans;result:=false;end;end;接下來,我們來看一下,如何運用這個樣式來解決問提呢,假設你有一個異動程序是這樣:/ 異動程序procedure TForm1.rename(sender: TObject);varn:integer;beginadodataset1.First;for n:=0 to adodataset1.RecordCount-1 do beginif adodataset1使用者=bruce then beginadodataset1.edit;adodataset1異動:=checkbox1.checked;adodataset1.post;end;adodataset1.next;end;end;現在,我們要為這個異動程序增加異動控能力,只要增加這樣的一個程序就可以了:procedure TForm1.Button1Click(Sender: TObject);beginif not dmconnection.RunTrans( rename )thenapplication.MessageBox(執行失敗,錯誤,0);end;把現有的異動程序當成一個參數,傳至 RunTrans 這個異動交易控制的運算中,就大功告成。【結 論】這個範例運用 Template Method 樣式,避免修改已經完成的程式,同時又可以增加系統的功能。當然這個範例,也可以運用類別繼承的方式來實現,其寫作的方式,與上述的範例,亦相去無幾,原事件改成宣告一個虛擬的程序,並在子類別中去實作這個程序即可,運用的概念是一樣的,這正是所謂戲法人人會變,巧妙各有不同,融會貫通之後就可以運用自如了。範例三 運用運用 FactoryFactory 工廠模式設計多人使用的權限控制工廠模式設計多人使用的權限控制 作者:陳國生 Email: bruce123edirect168.com【解決問題】在一個多人使用的系統中,根據不同的使用者,必須設計出不同的使用權限,要設計這樣的權限控管機制,很顯然相當複雜而且繁瑣。因此,如何使用一個簡單又容易維護的方式進行系統設計?在軟體設計領域裡面,簡單就是美,這是在靈活塑模裡面的一個宣言,追求簡單,其實不簡單,同樣的一個問題,有千百種解法,如何使用一個簡單又有彈性的設計,是程式設計者追求的極致,本範例的重點就是要具體實踐這個目標。【面臨問題】對已經寫好的程式,我們不希望修改,因此如何以擴充功能的方法,將此權限控制的功能加入系統?【運用技術】在重整技術中,有一個重要的原則,就是不要去更動已經設計好的程式,因此我們將設計一個即插即用的單元,為系統擴充多人使用的控管機制,因此在這個構想下,我們運用 Factory 工廠模式的設計樣式來實現這個設計。什麼是 Factory 工廠模式?工廠模式可以依實際需要,適時的產生我們所需要的物件,在於無法確定使用何種物件的時候非常好用。在 Delphi 中已經內建許多不同類型的物件,我們可以 隨手取用,所以設計一個工廠模式可以說非常的簡單。物件工廠本身有許多變形,如工廠方法( Factory Method ),抽象工廠( Abstract Factory ),雛形( Prototype ) 等等. 皆是。現在,我們假設每一個使用者登入時,會對應到一個權限物件,然後針對這個物件去設計使用現在,我們假設每一個使用者登入時,會對應到一個權限物件,然後針對這個物件去設計使用權限即可。換句話說,也就是說讓不同的使用者對應到不同的物件上面,再運用工廠模式,根權限即可。換句話說,也就是說讓不同的使用者對應到不同的物件上面,再運用工廠模式,根據不同的使用者,自動產生不同的物件,如此便可達到權限控制的目的據不同的使用者,自動產生不同的物件,如此便可達到權限控制的目的。當然,控制使用的權限,依控管方式不同,會方法有很多種,下面範例將提供其中一種控管方法。【範例實作】第一步:使用一個 TDataModule 來存放一些 TMainMenu 物件。第二步:TMainMenu 的數量根據使用者的多寡而定。第三步:增加一個 TActionList 物件,將所有可執行程式統一交由 TActionList 控管。第四步:根據不同的使用權限,將 TActionList 裡面的 TAction 指定至各個不同的 TMainMenu 裡面的 Action 屬性。以上四個步驟,在 Delphi 裡面都可以視覺化的完成,除了 TAction 裡面的 OnExecute 必須動手寫入欲執行的功能之外。至此,我們已經把準備對應到使用者的權限物件 TMainMenu 都設計完成了,接下來只要根據不同的使用者輸出不同物件即可,這部分要如何設計呢?首先我在 TDataNodule 的 OnCreate 事件中,加入判斷使用者的功能,並輸出物件:procedure TDataModule1.DataModuleCreate(Sender: TObject);varMyMainMenu:TMainMenu; User:string;begin/ 根據不同使用者,取得不同的 TMainMenu 物件,以下以此類推.User:=ParamStr(1);if User=001 then MyMainMenu:=MainMenu1;if User=002 then MyMainMenu:=MainMenu2;. / 接下來輸出物件至主畫面Application.MainForm.Menu:=MyMainMenu;end;以上完成之後,最後的一個步驟是把 TDataModule 在專案中自動建構起來,由於設計上是自動輸出物件至 MainForm,所以 TDataModule 的建構必須在 MainForm 之後
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号