zoukankan      html  css  js  c++  java
  • .net 多播委托的使用方法以及场景,更简单的观察者模式

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

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

    使用方法:

    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();
        }

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

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

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

  • 相关阅读:
    npm
    模块化开发
    Html input 标签
    H5 移动端布局
    Mysql指令
    php面向对象
    git指令
    css3 属性
    如何渲染数据
    angular 服务
  • 原文地址:https://www.cnblogs.com/liuqiwang/p/8196238.html
Copyright © 2011-2022 走看看