運用Observer(觀察者樣式)擺脫視覺化單元之間的糾纏 |
|
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
糾纏的問題: 當使用一個單元,你必須去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 發送簡訊給我 |
Thanks for sharing > < face='Lucida Console'>http://pywong.hk.st http://www.lazybones.ca
|
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
引言: Thanks for sharing > < face='Lucida Console'>http://pywong.hk.st http://www.lazybones.ca謝謝william 兄的回應,希望有空也能發表一些應用範例,供大家觀摩。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |