委托和事件的学习
2017-02-20 14:26
197 查看
参考:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx写的内容
1、 委托--它是一个类,它定义了方法的类型,实现将方法作为参数传递给另一个方法来调用,这种将方法动态的赋给参数的方式,可以避免了程序中过多的使用switch或IF-Else
//定义委托,它定义了可以代表方法的类型
public delegate void GreetingDelegate(string name);
//GreetingDelegate类似于string等类型一样。
public GreetingDelegate delegate1;//定义一个委托类型的变量---在客户端可以对它进行随意的赋值等操作,严重破坏对象的封装性。
delegate1 = EnglishGreeting; //
先给委托类型的变量赋值,注意第一个赋值,不能使用 “+=”,否则报错
delegate1 += ChineseGreeting; //
给此委托变量再绑定一个方法
总结:
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
2、事件
Event,它封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。
public Event GreetingDelegate MakeGreet ;
gm.MakeGreet = EnglishGreeting; // 编译错误1--只能使用“+=”或者“-=”
gm.MakeGreet += ChineseGreeting;
3、委托、事件和Observer模式
设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
现在我们需要写个程序来模拟这个烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater,它有代表水温的字段,叫做temperature;当然,还有必不可少的给水加热方法BoilWater(),一个发出语音警报的方法MakeAlert(),一个显示水温的方法,ShowMsg()。
Observer设计模式中主要包括如下两类对象:
Subject:监视对象,它往往包含着其他对象所感兴趣的内容。在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象。
Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动。在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水温。
在本例中,事情发生的顺序应该是这样的:
警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。
热水器知道后保留对警报器和显示器的引用。
热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器的MakeAlert()方法、显示器的ShowMsg()方法。
类似这样的例子是很多的,GOF对它进行了抽象,称为Observer设计模式:Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。
1、 委托--它是一个类,它定义了方法的类型,实现将方法作为参数传递给另一个方法来调用,这种将方法动态的赋给参数的方式,可以避免了程序中过多的使用switch或IF-Else
//定义委托,它定义了可以代表方法的类型
public delegate void GreetingDelegate(string name);
//GreetingDelegate类似于string等类型一样。
public GreetingDelegate delegate1;//定义一个委托类型的变量---在客户端可以对它进行随意的赋值等操作,严重破坏对象的封装性。
delegate1 = EnglishGreeting; //
先给委托类型的变量赋值,注意第一个赋值,不能使用 “+=”,否则报错
delegate1 += ChineseGreeting; //
给此委托变量再绑定一个方法
总结:
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
2、事件
Event,它封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。
public Event GreetingDelegate MakeGreet ;
gm.MakeGreet = EnglishGreeting; // 编译错误1--只能使用“+=”或者“-=”
gm.MakeGreet += ChineseGreeting;
3、委托、事件和Observer模式
设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
现在我们需要写个程序来模拟这个烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater,它有代表水温的字段,叫做temperature;当然,还有必不可少的给水加热方法BoilWater(),一个发出语音警报的方法MakeAlert(),一个显示水温的方法,ShowMsg()。
Observer设计模式中主要包括如下两类对象:
Subject:监视对象,它往往包含着其他对象所感兴趣的内容。在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象。
Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动。在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水温。
在本例中,事情发生的顺序应该是这样的:
警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。
热水器知道后保留对警报器和显示器的引用。
热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引用,自动调用警报器的MakeAlert()方法、显示器的ShowMsg()方法。
类似这样的例子是很多的,GOF对它进行了抽象,称为Observer设计模式:Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。
相关文章推荐
- 委托与事件学习笔记1---什么是委托?
- [ASP.NET学习笔记之二十二].NET中的委托与事件研究
- .Net学习难点讨论系列1 – 委托与事件之事件
- 委托和事件学习笔记
- 我是如何学习设计模式的一:.NET C# 委托定天下,学好委托事件,设计模式精髓可以理解三分之一,怎么说也是三分天下之势了
- 委托与事件学习笔记1---什么是委托?
- C#学习笔记之三:C#接口与事件委托
- C#中的委托和事件学习(续)第1/3页
- 委托、匿名方法、事件学习小结
- C#学习笔记 委托和事件
- 事件和委托学习
- 自定义控件学习笔记(5):事件委托列表的使用
- 委托与事件学习笔记1---什么是委托?
- C#中的委托和事件学习(续)
- 设计模式学习笔记二:面向对象基础六之委托与事件
- C#学习5-委托与事件
- 学习委托与事件的总结,附上一个例子
- 学习委托和事件
- 事件和委托学习小练习
- 学习事件与委托