做过WebForm开发的朋友

时间:2022-05-17 06:45:16

本篇文章更适合具有必然开发经验,必然功底,且对底层代码有所研究的伴侣!!!

本篇文章主要给与理论和代码实例相结合方法来阐述委托和事件,涉及到一些界限技术,如软件架构的OCP原则(开-闭原则),

软件架构解耦,设计模式(Sender-Order)和事件驱动模型,有必然难度和深度,不适合低级者。

第一部份   委托

关于委托内容,主要围绕下图来阐述。

做过WebForm开发的朋友

一   委托是什么(what)

(一)委托孕育产生的配景之一

1.我们先来假设这样一个情景需求:

设计一个系统,使其满足如下条件:

(1)当前,只有中国人和英国人使用该系统;

(2)向系统输入用户名和相应的语言,将孕育产生相应语言的问候语;

做过WebForm开发的朋友

(3)后期,可能会有其他国家语言插手该系统(系统变革的部分) ;

2.技术方案实现

关于技术方案实现,我们可以给与下图中的三种方法之一。

为了更好地叙述委托,我们分袂实现三种技术方案,并找出它们的关系。

做过WebForm开发的朋友

2.1 一般实现

Code(控制台措施)

 View Code

Result

做过WebForm开发的朋友

分析

做过WebForm开发的朋友

2.2用接口实现

如上,我们分析了方案一中的问题,为了更好地解决方案一存在的问题,我们给与面向接口编程的形式来实现。

2.2.1  什么是面向接口编程?

面向接口编程,主要是解决软件架构设计中“消息问题”,即封装不乱(静),剥离变革(抽出变革)。

Code:

 View Code

result

做过WebForm开发的朋友

分析:

(1)如上,我们将变革因子"语言"剥离出来,形成接口,以后只要每增加一个语言,只需实现接口即可,满足了OCP原则,根基解决了方案一中存在的问题;

(2)如上代码只是为了演示面向接口编程这个成果,并不完善,感兴趣的读者,可自行完善(如将语言界说为枚举类型等);

做过WebForm开发的朋友

方案二中的代码,细心的读者会发明,Main要领中new了三个东西,假若以后系统有300门语言,那岂不New 300个类,这样的话,也倒霉于代码维护呀,怎么解决这个问题呢?(提示一下,给与设计模式抽象工厂即可解决该问题)

2.3 用委托实现

在这里,没接触过委托的读者,先跳过这部分,往下读,看完(三)怎样使用委托(How to use)后,再来看本部分。

Code

 View Code

Result

做过WebForm开发的朋友

2.3 分析上述三种实现方案的关系

通过上诉三种方法的对照,我们容易得出委托的如下结论:

(1)抽象要领,屏蔽要领细节,挪用只需通报要领名字即可;

(2)能够实现措施的解耦,松耦合(在方案一中,GetGreetingContens要领体内new了GreetToUsers东西,强耦合)

做过WebForm开发的朋友

(3)委托一般饰演中间者的角色,这成果在委托事件中浮现非常明显(第二部分 事件 将详细阐述)

如我们在租屋子时,可以直接找房主(技术实现的一般要领,强耦合,让租房者和房主直接联系),也可找中介(技术实现的委托,松耦合,租房者通过中介来与房主联系)

做过WebForm开发的朋友

2.4 委托配景概述

委托的重要孕育产生配景,就是事件驱动模型(关于什么是事件和事件驱动,在本文第二部份 事件 阐述)。

(二) 委托界说

用delegate关键字界说委托(注意,委托是没有要领体的,类似接口里面的要领),在界说委托前,必需明确两个问题:

1.委托将要绑定的要领;

2.委托的形参类型,形参个数和委托的返回值必需与将要绑定的要领的形参类型,形参个数和返回值一致;

(三)相关观点

委托涉及的相关观点有函数指针,类型安适性、事件、Lambda表达式等

1.函数指针:在C++中,指针的一个类别,主要指向函数(变量指针,主要指向变量地点),可以把C#中的委托理解为函数指针;

2.类型安适性:在C++中,我们都知道指针是类型不安适的(返回值,返回类型和什么时候返回,这些都是未知的),而委托是类型安适的;

3.事件:可以把事件理解为委托的一种特例(在本文第二部份 事件 阐述)