本篇文章更适合具有必然开发经验,必然功底,且对底层代码有所研究的伴侣!!!
本篇文章主要给与理论和代码实例相结合方法来阐述委托和事件,涉及到一些界限技术,如软件架构的OCP原则(开-闭原则),
软件架构解耦,设计模式(Sender-Order)和事件驱动模型,有必然难度和深度,不适合低级者。
第一部份 委托
关于委托内容,主要围绕下图来阐述。
一 委托是什么(what)
(一)委托孕育产生的配景之一
1.我们先来假设这样一个情景需求:
设计一个系统,使其满足如下条件:
(1)当前,只有中国人和英国人使用该系统;
(2)向系统输入用户名和相应的语言,将孕育产生相应语言的问候语;
(3)后期,可能会有其他国家语言插手该系统(系统变革的部分) ;
2.技术方案实现
关于技术方案实现,我们可以给与下图中的三种方法之一。
为了更好地叙述委托,我们分袂实现三种技术方案,并找出它们的关系。
2.1 一般实现
Code(控制台措施)
View Code
Result
分析
2.2用接口实现
如上,我们分析了方案一中的问题,为了更好地解决方案一存在的问题,我们给与面向接口编程的形式来实现。
2.2.1 什么是面向接口编程?
面向接口编程,主要是解决软件架构设计中“消息问题”,即封装不乱(静),剥离变革(抽出变革)。
Code:
View Code
result
分析:
(1)如上,我们将变革因子"语言"剥离出来,形成接口,以后只要每增加一个语言,只需实现接口即可,满足了OCP原则,根基解决了方案一中存在的问题;
(2)如上代码只是为了演示面向接口编程这个成果,并不完善,感兴趣的读者,可自行完善(如将语言界说为枚举类型等);
方案二中的代码,细心的读者会发明,Main要领中new了三个东西,假若以后系统有300门语言,那岂不New 300个类,这样的话,也倒霉于代码维护呀,怎么解决这个问题呢?(提示一下,给与设计模式抽象工厂即可解决该问题)2.3 用委托实现
在这里,没接触过委托的读者,先跳过这部分,往下读,看完(三)怎样使用委托(How to use)后,再来看本部分。
Code
View Code
Result
2.3 分析上述三种实现方案的关系
通过上诉三种方法的对照,我们容易得出委托的如下结论:
(1)抽象要领,屏蔽要领细节,挪用只需通报要领名字即可;
(2)能够实现措施的解耦,松耦合(在方案一中,GetGreetingContens要领体内new了GreetToUsers东西,强耦合)
(3)委托一般饰演中间者的角色,这成果在委托事件中浮现非常明显(第二部分 事件 将详细阐述)
如我们在租屋子时,可以直接找房主(技术实现的一般要领,强耦合,让租房者和房主直接联系),也可找中介(技术实现的委托,松耦合,租房者通过中介来与房主联系)
2.4 委托配景概述
委托的重要孕育产生配景,就是事件驱动模型(关于什么是事件和事件驱动,在本文第二部份 事件 阐述)。
(二) 委托界说
用delegate关键字界说委托(注意,委托是没有要领体的,类似接口里面的要领),在界说委托前,必需明确两个问题:
1.委托将要绑定的要领;
2.委托的形参类型,形参个数和委托的返回值必需与将要绑定的要领的形参类型,形参个数和返回值一致;
(三)相关观点
委托涉及的相关观点有函数指针,类型安适性、事件、Lambda表达式等
1.函数指针:在C++中,指针的一个类别,主要指向函数(变量指针,主要指向变量地点),可以把C#中的委托理解为函数指针;
2.类型安适性:在C++中,我们都知道指针是类型不安适的(返回值,返回类型和什么时候返回,这些都是未知的),而委托是类型安适的;
3.事件:可以把事件理解为委托的一种特例(在本文第二部份 事件 阐述)