首先来说一下什么是多播委托

多播委托就是在委托里定义一个或者多个方法的一个集合

使用方法:

public Action actList;
//添加方法
public void AddActionMethod()
{
actList += //方法一
actList += //方法二
actList += //方法三
actList += //方法四
}
//移除时从最后一个开始匹配,匹配到完全吻合的就会移除
//匿名方法,实例方法,内存路径不同匹配到的没有完全吻合,无法移除
public void RemoveActionMethod()
{
actList -= //方法一
actList -= //方法二
actList -= //方法三
actList -= //方法四
}
//执行方法,从第一个开始执行
public void ActInvoke()
{
actList.Invoke();
}

以上就是多播委托的使用方法,不懂的可以参考一下更基础的:.NET 委托的使用方法以及使用委托的好处

下面做一个实际中的使用场景:如何使用委托来更好的实现《观察者模式》,不懂观察者模式的可以进去看看

观察者模式的代码我就不写了,直接上使用委托实现的观察者模式

  
//定义一个接口
  public interface IObject
{
void DoAction();
}
  /// <summary>
/// 订阅者,继承接口
/// 狗
/// </summary>
public class Dog:IObject
{
public void DoAction()
{
this.Wang();
}
/// <summary>
/// 狗叫声
/// </summary>
public void Wang()
{
Console.WriteLine("狗叫了一声");
}
}
   /// <summary>
/// 订阅者,继承接口
/// 鸭子
/// </summary>
public class Duck : IObject
{
public void DoAction()
{
this.Ga();
}
/// <summary>
/// 鸭子叫声
/// </summary>
public void Ga()
{
Console.WriteLine("鸭子嘎嘎嘎");
}
}
   /// <summary>
/// 订阅者,继承接口
/// 猪
/// </summary>
public class Pig:IObject
{
public void DoAction()
{
this.Heng();
}
/// <summary>
/// 猪叫声
/// </summary>
public void Heng()
{
Console.WriteLine("猪哼哼哼");
}
}
   /// <summary>
/// 订阅者,继承接口
/// 老鼠
/// </summary>
public class Mouse : IObject
{
public void DoAction()
{
this.Zhi();
}
/// <summary>
/// 老鼠叫声
/// </summary>
public void Zhi()
{
Console.WriteLine("老鼠吱吱叫");
}
}

以上是订阅者以及定义好的接口

    /// <summary>
/// 发布者
/// 一声喵叫引发一系列动作
/// </summary>
public class Cat
{
#region 观察者模式标准写法
/// <summary>
/// 观察者容器
/// </summary>
public List<IObject> _IObjectObserver = new List<IObject>();
/// <summary>
/// 添加动作
/// 注册观察者
/// </summary>
/// <param name="iObject"></param>
public void AddObject(IObject iObject)
{
this._IObjectObserver.Add(iObject);
}
/// <summary>
/// 删除动作
/// 注销观察者
/// </summary>
/// <param name="iObject"></param>
public void RemoveObject(IObject iObject)
{
this._IObjectObserver.Remove(iObject);
}
/// <summary>
/// 通知所有的观察者,执行动作
/// </summary>
public void MiaoObserver()
{
Console.WriteLine("--------观察者模式-------");
foreach (var item in _IObjectObserver)
{
item.DoAction();
}
}
#endregion #region 使用委托实现观察者模式
/// <summary>
/// 动作容器
/// </summary>
public Action MiaoAction;
/// <summary>
/// 执行委托中的动作
/// </summary>
public void MiaoActionMethod()
{
Console.WriteLine("--------委托执行动作-------");
if (MiaoAction != null)
{
this.MiaoAction.Invoke();
}
}
#endregion
}

以上是发布者,一声猫的喵叫引发的一系列动作

 static void Main(string[] args)
{
//特殊类,无法被继承
//System.MulticastDelegate //观察者模式的标准写法
Cat cat = new Cat();
cat.AddObject(new Dog());
cat.AddObject(new Duck());
cat.AddObject(new Pig());
cat.AddObject(new Mouse());
cat.MiaoObserver(); //多播委托写法
cat.MiaoAction += new Dog().Wang;
cat.MiaoAction += new Duck().Ga;
cat.MiaoAction += new Pig().Heng;
cat.MiaoAction += new Mouse().Zhi;
cat.MiaoActionMethod(); Console.ReadLine(); }

上面的例子是写了观察者模式跟委托放在一起,所以显得代码有点多

如果只使用多播委托来实现,去掉下面几个地方

/// <summary>
/// 使用委托就可以删除下面的接口
/// 以及所有实现该接口方法的类(只有子类的具体动作)
/// 使用委托可以完全丢弃这些
/// </summary>
public interface IObject
{
void DoAction();
}

使用多播委托来实现观察者模式,不需要该接口以及接口的实现

如果对观察者模式有一定了解的应该就可以清楚,使用多播委托来实现观察者模式,可以省事很多,减少大量代码

代码有点多,仔细琢磨一下,或者自己写一遍来体会一些这个场景下多播委托的神奇

.net 多播委托的使用方法以及场景,更简单的观察者模式的更多相关文章

  1. 多播委托和匿名方法再加上Lambda表达式

    多播委托就是好几个方法全都委托给一个委托变量 代码: namespace 委托 { class Program { static void math1() { Console.WriteLine(&q ...

  2. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  3. 委托+内置委托方法+多播委托+lambda表达式+事件

    委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字 ...

  4. 【小白学C#】谈谈C#多播委托因异常而终止的解决方案

    一.前言 前几天,马三在与朋友闲聊技术的时候,朋友忽然抛出一个问题,把马三难倒了,本着求知的精神,回来以后马三就查阅了相关资料并做了一些实验,终于把问题搞明白了,因此写下本篇博客记录一下.首先,问题是 ...

  5. C#多播委托/多播代理

    定义:委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针.理解委托的一种方式可以把委托的作用当作是给方法签名指定名称.委托的定义类似于方法的定义,但没有方法体,定义的委托名前要加上关 ...

  6. 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

    委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...

  7. 委托、多播委托(MulticastDelegate)

    委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...

  8. 【C#进阶】多播委托和委托数组像是一回事~

    这个MathOperation类有三静态方法,参数都是double,并且没有返回值,考虑用Action<>() 这种预定义的委托哦 class MathOperations { publi ...

  9. 委托Delegate,多播委托和委托链

    定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static Calculat ...

随机推荐

  1. httpclient post请求带参数返回数据乱码问题解决

    客户端代码: //带参数的post请求 @Test public void doPostWithParam() throws Exception { CloseableHttpClient httpC ...

  2. Codeforces Round #396 (Div. 2) A B C D 水 trick dp 并查集

    A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...

  3. Spring------mysql读写分离

    1. 为什么要进行读写分离 大量的JavaWeb应用做的是IO密集型任务, 数据库的压力较大, 需要分流 大量的应用场景, 是读多写少, 数据库读取的压力更大 一个很自然的思路是使用一主多从的数据库集 ...

  4. java删除目录下符合条件的文件

    自己做的一个小程序,目的是:删除某个目录下所有的文件大小为0的文件.同理其他的条件也可以,只需修改delFile()方法中的判断条件即可. 下面是代码,有需要的同学可以参考下,如有错误请指出,不胜感激 ...

  5. 第01篇 为什么推荐使用String直接赋值

    在四海学的时候,可能需要我们经过沉淀才会去想一些事情,有的时候不知道为什么这样或者那样的时候,从今天看是,胖先生打算给大家开辟一个课程,就是我的读书笔记. 首先我们来认识一下String字符串 一般对 ...

  6. easing.js让页面动画丰富起来

    jQuery Easing是一款比较老的jQuery插件,在很多网站都有应用,尤其是在一些页面滚动.幻灯片切换等场景应用比较多.它非常小巧,且有多种动画方案供选择,使用简单,而且免费. <scr ...

  7. js的数据类型--字符串

    js的数据类型——字符串 这篇我们来说说js的第二种数据类型——字符串. js的内置功能之一就是字符串拼接.如果将加号(+)运算符用于数字,表示两数相加.但将它作用于字符串,则表示字符串拼接,将第二个 ...

  8. java 反射和new的区别

    关于java 反射和new的区别,在这里我不做多讲,因为网上有大把资料,描述得很详细. 今天我只讲一点,为什么要用反射?直接用new不行么?干嘛弄得那么麻烦! 1.基本上效果差不多,但是new对象,无 ...

  9. 东方14ACM小组 Challenge 11

    总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)修改数列中的一个数 (2)求 ...

  10. cocos2dx中启用lua脚本

    AppDelegate 的 applicationDidFinishLaunching 方法中加载Lua引擎 bool AppDelegate::applicationDidFinishLaunchi ...