我通過對一個winform窗體應用程序的不斷優化,來表現如何通過“委託” 和 “事件” 來降低模塊的低耦合。
但是在這之前我們要明白,什麼是低耦合。
簡單的說就是兩個模塊之間,如果一個模塊中的一個類,需要實例化另一個模塊中的一個類,然後調用方法,這樣這兩個模塊就是綁在一輛戰車上,如果一個模塊突然消失,會報錯,我們要做的就是將一個模塊中要用的方法,加入到一個委託或事件中,等待其他模塊來註冊,其他模塊是否消失,與擁有委託或事件的模塊無關。聽着還是很繞,上示例。
/*------------------------------------------------------------------------------------------------------分割線-----------------------------------------------------------------------------------------------------------------------*/
一..目的:擁有兩個窗體(ParentForm和ChildForm),各擁有一個文本框,使用一個窗體向另一個窗體發送消息,顯示在文本框中。
二.具體操作:
1. 最愚蠢的一種方式。
新建一個winfrom應用程序,加入控件並改變相關命名。
顯示結果:
一個父窗體直接操作子窗體的一個數據,這在面向對象看來,是愚蠢之極。我們下面加以改良,可能我們會這樣改,在子窗體中提供方法,進行修改,這樣的好處還可以進行校驗,看輸入是否正確。
2.看似不錯的更改方式
在子窗體中添加方法,用於修改子窗體的txt_receive
將窗體文本框設爲私有
在父窗體代碼中調用方法:
這種方法起碼有面向對象,但是很可惜,這依然是菜鳥的書寫方式,
這種方式的缺點,如果我刪了childForm,主窗體就崩潰了,並且我如有很多窗體與父窗體關聯,要大量的修改代碼。這樣的兩個窗體的狀體就是耦合,我們要進行解耦,即在父窗體中不能出現其他窗體的實例或代碼。
3.解耦,使用委託。
如果想避免2中的錯誤,我們應該在父窗體中不能出現其他窗體(模塊)的對象。
這樣如果我們再增加窗體,我們父窗體的點擊事件,不需要變化。
委託並不是很安全,我們用事件,事件和委託的關係就像私有變量和屬性的關係。
4.用事件
即,點擊按鈕後,不再直接調用委託,而是觸發事件。
添加一個類
結果運行成功。
最後在強調一下,事件和委託的區別:
1.事件是委託的一個特殊實例
2.事件只能在當前類內部觸發,但是可以再其他地方 +=,所以安全。
3.沒了,其他的使用方法,事件和委託是一樣的。