全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1348
推到 Plurk!
推到 Facebook!

運用Observer(觀察者樣式)擺脫視覺化單元之間的糾纏

 
bruce
中階會員


發表:19
回覆:121
積分:83
註冊:2002-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-11 09:30:11 IP:211.21.xxx.xxx 未訂閱
糾纏的問題: 當使用一個單元,你必須去Uses這個單元,同時Delphi 也不禁止你單元之間去相互Uses,但可能造成的糾纏,你必須自行承擔。 觀察者樣式的定義: 在物件之間定義一個一對多的依存關係,當一個物件改變時,所有相依的物件的物件會被通知,並自動更新。 尋找Delphi中的可運用之觀察者樣式: 在Delphi 中,你可以運用現成的物件,輕易的使用這個樣式去解決以上這個問題,而唯一需要學習的是對樣式的認識及對樣式運用的概念。TActionList 可以定義多個事件,而這些事件,剛好又可以讓TButton 及相關具有Action 屬性的物件所接收,運用這個機制可以輕易解決視覺化單元的糾纏問題。 運用範例解說: 第一步:除了主畫面Mmainform之外,我們另外定義出兩個視覺化單元Form3及Form4,一個TDataModule 同時在TDataModule上放了一個TActinList ,在TActinList 上面定義兩個TAction分別去SHow出這兩個Form。程式碼如下 procedure TDataModule1.Action1Execute(Sender: TObject); begin FORM4.SHOW; end; procedure TDataModule1.Action2Execute(Sender: TObject); begin FORM3.SHOW; end; 第二步:在MainForm 上放一個TButom,同時Uses DataModule。 第三步:設定Mainform 上的TButtom 的Action 屬性=DataModule.Action2 ,以便SHow出Form3。 第四步:在Form3,Form4上各放一個TButton 。 第五步:修改DataModule上的Taction 的Execute 事件如下: procedure TDataModule1.Action1Execute(Sender: TObject); begin FORM4.Button1.Action:=Action2; FORM4.SHOW; end; procedure TDataModule1.Action2Execute(Sender: TObject); begin FORM3.SHOW; FORM3.Button1.Action:=Action1; end; 執行結果: 在MainForm 可以Show出Form3,而Form3與Form4又可以互相呼叫。藉由事件的設定,兩個視覺化單元可以相互呼叫,但卻又不彼此不認識 ( 沒有相互USES )。 進一步運用: 這個樣式的威力,不僅於此,除了解開單元之間不當的連結外,當您去改變任何一個TAction時,所有相關的連結,都會一起被改變,換個角度來說,您可以根據不同的使用需求,讓同一個使用介面,而具有不同的行為。 舉個例子來說:當您在MainForm 上,下達 DataModule1.Action1.OnExecute:=nil ,這時候Form3就失去show出Form4的功能了,而Form3的TButtom 的使用介面也自動改變成灰色了。 與其他樣式的結合運用: 運用這個樣式,如果您再結合Adapter(轉接器樣式)或是Facade(外觀樣式) ,哪就可以輕易解決更複雜的問題,譬如您使用了一個API,但這個API並非適用各種作業系統,使用介面也不相同,這時候你可以定一個轉接器出來,再透過觀察者樣式通知整個系統,系統也就更具有彈性了。
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-11 12:11:16 IP:147.8.xxx.xxx 未訂閱
Thanks for sharing  > < face='Lucida Console'>http://pywong.hk.st http://www.lazybones.ca
bruce
中階會員


發表:19
回覆:121
積分:83
註冊:2002-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-11 19:37:39 IP:218.164.xxx.xxx 未訂閱
引言: Thanks for sharing > < face='Lucida Console'>http://pywong.hk.st http://www.lazybones.ca
謝謝william 兄的回應,希望有空也能發表一些應用範例,供大家觀摩。
系統時間:2024-07-04 9:20:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!