我通过对一个winform窗体应用程序的不断优化,来表现如何通过“委托” 和 “事件” 来降低模块的低耦合。
但是在这之前我们要明白,什么是低耦合。
简单的说就是两个模块之间,如果一个模块中的一个类,需要实例化另一个模块中的一个类,然后调用方法,这样这两个模块就是绑在一辆战车上,如果一个模块突然消失,会报错,我们要做的就是将一个模块中要用的方法,加入到一个委托或事件中,等待其他模块来注册,其他模块是否消失,与拥有委托或事件的模块无关。听着还是很绕,上示例。
/*------------------------------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------------------------------------------*/
一..目的:拥有两个窗体(ParentForm和ChildForm),各拥有一个文本框,使用一个窗体向另一个窗体发送消息,显示在文本框中。
二.具体操作:
1. 最愚蠢的一种方式。
新建一个winfrom应用程序,加入控件并改变相关命名。
显示结果:
一个父窗体直接操作子窗体的一个数据,这在面向对象看来,是愚蠢之极。我们下面加以改良,可能我们会这样改,在子窗体中提供方法,进行修改,这样的好处还可以进行校验,看输入是否正确。
2.看似不错的更改方式
在子窗体中添加方法,用于修改子窗体的txt_receive
将窗体文本框设为私有
在父窗体代码中调用方法:
这种方法起码有面向对象,但是很可惜,这依然是菜鸟的书写方式,
这种方式的缺点,如果我删了childForm,主窗体就崩溃了,并且我如有很多窗体与父窗体关联,要大量的修改代码。这样的两个窗体的状体就是耦合,我们要进行解耦,即在父窗体中不能出现其他窗体的实例或代码。
3.解耦,使用委托。
如果想避免2中的错误,我们应该在父窗体中不能出现其他窗体(模块)的对象。
这样如果我们再增加窗体,我们父窗体的点击事件,不需要变化。
委托并不是很安全,我们用事件,事件和委托的关系就像私有变量和属性的关系。
4.用事件
即,点击按钮后,不再直接调用委托,而是触发事件。
添加一个类
结果运行成功。
最后在强调一下,事件和委托的区别:
1.事件是委托的一个特殊实例
2.事件只能在当前类内部触发,但是可以再其他地方 +=,所以安全。
3.没了,其他的使用方法,事件和委托是一样的。