用一句话解释委托:委托是一种可以把引用存储为函数的类型。

有些类似Spring框架对于接口的用法,向Action中注入Service对象。Action并不知道调用哪个服务层,只有容器通过配置文件

向Action注入Service对象后,Action才能知道调用的是哪个实现的服务层对象。

你传入的是那个实现类,我就执行哪个实现类的方法。

从网上搜得一段说明,帮助理解:

委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;

可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。

分析下面例子:首先对于一个热水器对象来说,他满足一定条件的时候需要触发一个事件(委托),但这个事件不那么确定或者不只调用一个方法。

那么我们就在这个对象中声明一个委托方法:

 using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
// 热水器
public class Heater
{
private int temperature;
public delegate void BoilHandler(int param); //声明委托
public event BoilHandler BoilEvent; //声明事件
// 烧水
public void BoilWater()
{
for (int i = ; i <= ; i++)
{
temperature = i;
if (temperature > )
{
if (BoilEvent != null)
{ //如果有对象注册
BoilEvent(temperature); //调用所有注册对象的方法
}
}
}
}
}
}

然后,再定义处理这个事件的一些方法:

 // 警报器
public class Alarm
{
public void MakeAlert(int param)
{
Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
}
}
 // 显示器
public class Display
{
public static void ShowMsg(int param)
{ //静态方法
Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
}
}

好了,一切准备好,我们利用注册事件,调用这些委托的方法:

 class Program
{
static void Main()
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.BoilEvent += alarm.MakeAlert; //注册方法
heater.BoilEvent += (new Alarm()).MakeAlert; //给匿名对象注册方法
heater.BoilEvent += Display.ShowMsg; //注册静态方法
heater.BoilWater(); //烧水,会自动调用注册过对象的方法
}
}

输出为:

Alarm:嘀嘀嘀,水已经 96 度了:

Alarm:嘀嘀嘀,水已经 96 度了:

Display:水快烧开了,当前温度:96度。

最新文章

  1. tomcat对请求路径的匹配过程(原创)
  2. C#高级编程笔记 Day 3, 2016年9月 8日 抽象类
  3. phpcms--模型管理,推荐位管理,类别管理
  4. http://www.cnblogs.com/dumuqiao/p/3654702.html?utm_source=tuicool&amp;utm_medium=referral
  5. Python顺序集合之 List
  6. MyBatis返回主键
  7. Struts2配置RESULT中TYPE的参数说明
  8. javascript window.confirm确认 取消对话框实现代码小结
  9. Mapper 动态代理方式
  10. 【转】iptables 命令介绍
  11. .net Json 反序列化时,属性带点
  12. Docker第二章:docker基础1--镜像,容器&amp;仓库
  13. 16-(基础入门篇)GPRS(Air202)关于多个文件中的变量调用和定时器
  14. python+opencv 运行环境搭建
  15. Android Studio项目提交(或更新)到github的方法
  16. java后台获取和js拼接展示信息
  17. python笔记04:字典
  18. 【刷题】BZOJ 2154 Crash的数字表格
  19. vrrp_script不起作用解决方案
  20. win2008 svn 搬迁

热门文章

  1. Controller怎么接收Ajax传来的data
  2. 基于ConcurrentHashMap的本地缓存
  3. Java常用API(String类)
  4. 各种jar包下载地址
  5. 为什么大家都在用Fiddler?
  6. Mock分页
  7. coding如何绑定二次验证码_虚拟MFA_两步验证_身份验证?
  8. 最大连续区间(HDU-1540)
  9. sed在文本第一行和最后一行添加字符串
  10. A - A Simple Problem with Integers (线段树的区间修改与区间查询)