观察者设计模式(C#委托和事件的使用)
来源:互联网 发布:nba2k12手游需要网络吗 编辑:程序博客网 时间:2024/05/17 04:46
观察者模式是一个老生常谈的问题,但是在实际开发中还是很有用。在观察者设计模式中,有一个被观察者,若干个观察者。当被观察者发生某个动作时,注册到被观察者身上的观察者作出自身的响应(调用观察者的方法)。在被观察者身上,往往通过一个具有特殊签名的委托,即事件。
以下三个类,一个为调用类,一个为被观察者(Cat),一个为观察者(Mouse):
using System;namespace 委托与事件的学习_观察者设计模式_{ //被观察者 class Cat { private String _name; private string _color; delegate void MyDelegate();//自定义一个委托类型,该委托可以包装一个没有返回值和参数的方法 private event MyDelegate CatComeEventHandler;//利用委托声明定义一个事件。但是委托和事件并没有本质区别,只是事件不可以在定义它的类外部 //被访问。事件,具有特殊签名的委托。 public Cat(string name,string color,Mouse mouse) { this._name = name; this._color = color; this.CatComeEventHandler += mouse.MouseRun;//注册事件,将事件指向mouse.MouseRun方法 } public void CatCome() { Console.WriteLine("名字为:"+_name+"的小猫叫了一声"); CatComeEventHandler();//利用事件调用被注册的方法。CatCome事件发生,被注册的事件也发生。这就是观察者模式。 } }}
using System;namespace 委托与事件的学习_观察者设计模式_{ //观察者 class Mouse { private String _name; private String _color; public Mouse(string name,string color) { _name = name; _color = color; } public void MouseRun() { Console.WriteLine("名字为:"+_name+"的老鼠开始逃跑了"); } }}
using System;namespace 委托与事件的学习_观察者设计模式_{ //调用类 class Program { static void Main(string[] args) { Mouse mouse = new Mouse("米奇", "黄色"); Cat cat = new Cat("米奇", "黄色", mouse); cat.CatCome(); Console.ReadKey(); } }}
总结:猫为被观察者,老鼠为观察者。猫类里面有一个委托,和利用该委托定义的事件。每个老鼠的一个行为(方法)注册到了猫的身上,当猫发生某个
行为时,触发了注册到猫身上的老鼠的一个方法(行为)。
注意:猫(被观察者)有一个委托,和一个事件,并且有一个触发整个方法链的一个初始方法,在该方法内调用事件(包装了观察者(老鼠)的行为)。整个行为链为:猫发出某个动作,老鼠相应的动作接着发生。
老鼠类里里面有一个方法,这个方法必须注册到猫的事件里,在猫的初始方法里调用这个事件,即是调用老鼠的方法。
至于事件的注册:可以在猫类里面注册,前提是必须将老鼠对象传递过来。也可以在老鼠类里面注册事件,这种情况可以使用单例模式。
阅读全文
0 0
- 观察者设计模式(C#委托和事件的使用)
- c#观察者模式和事件委托的联合使用
- C# 观察者模式(委托的使用)
- 设计模式------观察者模式(ObserverPattern)和委托事件
- C# 观察者模式和委托、事件
- C#委托和事件 观察者模式理解
- c#委托和事件及观察者模式
- C# 中的委托和事件 观察者模式
- C#观察者模式-事件委托
- 在C#中使用代理(即委托)的方式触发事件(观察者模式)
- 初识c#---委托,事件和观察者模式(Observer)设计模式
- C#事件和观察者设计模式
- 用C#中的委托和事件简单实现观察者模式
- C# 中的委托和事件 以及观察者模式
- 委托和事件(五)--例子--涵盖了观察者设计模式
- c#委托和事件,Observer设计模式
- C#中使用委托和事件实现观察者模式(observer pattern)
- C#中使用委托和事件实现观察者模式(observer pattern)
- Springmvc的对象接收
- 封装AFHTTPSessionManager
- node 打开中文乱码
- MySQL多表查询
- 第一个mysql存储过程
- 观察者设计模式(C#委托和事件的使用)
- 判断是否是平衡二叉树
- Partition List leetcode java
- NIO学习1(Buffer)
- 8-14 DAIRY
- flask_从名词解释开始
- .NET——NPOI操作excel
- 形态股价预测模型
- SpringMvc上传文件