委托系列07-多播委托之观察者模式


一、案例需求

??有一个Cat类,其中有一个Miao(猫叫)的方法。每次猫叫后,其他动物就会执行响应的动作。

代码:

    public class Cat
    {
        public void Miao()
        {
            Console.WriteLine("{0} Miao", this.GetType().Name);
        }
    }

二、普通方式

代码:

    public class Cat
    {
        public void Miao()
        {
            Console.WriteLine("{0} Miao", this.GetType().Name);
            new Dog().Wang(); //狗叫了
            new Mouse().Run();//老鼠跑了
            new Baby().Cry(); // 小孩哭了
            new Mother().Wispher();
            new Father().Roar();
            new Neighbor().Awake();
            new Stealer().Hide();
        }
    }

??以上这种方式存在以下问题:

  • 1.职责不单一---一个类中包含的职责太多了,除了Miao 一声,依赖于其他的类太多;
  • 2.依赖太重--依赖于Dog、Mouse、....---代码不稳定;Dog、Mouse、....任何一个类的修改,都有可能会影响到这只猫;
  • 3.这完全是面向过程式编程--完全是翻译需求;

三、多播委托(观察者模式)

1、创建委托

public  Action MiaoAction = null; 

2、创建MiaoDelegate方法,用于执行委托

        /// 
        /// 这个方法仅仅只是Miao一声
        /// 引发的动作---可以放到多播委托中去
        /// 
        public void MiaoDelegate()
        {
            Console.WriteLine("{0} MiaoDelegate", this.GetType().Name);

            //方式一:
            //if (MiaoAction != null)
            //{
            //    MiaoAction.Invoke();
            //}

            //方式二:
            MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作 
        }

3、注册委托

                    Console.WriteLine("************************this is  delegate****************************");
                    {
                        cat.MiaoAction += new Dog().Wang; //狗叫了
                        cat.MiaoAction += new Mouse().Run;//老鼠跑了
                        cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Baby().Cry; // 小孩哭了
                        //cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Father().Roar;
                        cat.MiaoAction += new Neighbor().Awake;
                        cat.MiaoAction += new Stealer().Hide;
                    }

4、执行委托

                    Console.WriteLine("************************this is  delegate****************************");
                    {
                        cat.MiaoAction += new Dog().Wang; //狗叫了
                        cat.MiaoAction += new Mouse().Run;//老鼠跑了
                        cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Baby().Cry; // 小孩哭了
                        //cat.MiaoAction += new Mother().Wispher;
                        cat.MiaoAction += new Father().Roar;
                        cat.MiaoAction += new Neighbor().Awake;
                        cat.MiaoAction += new Stealer().Hide;

                        //执行委托
                        cat.MiaoDelegate();
                    }

5、输出结果

6、优势

7、多播委托的另外一种实现方式

1、代码准备

IObject接口:

    public interface IObject
    {
        void DoAction();
    }

Dog类实现了IObject接口:

    public class Dog : IObject
    {

        //public Dog(int id,string i)
        //{

        //}

        public void DoAction()
        {
            this.Wang();
        }
        public void Wang()
        {
            Console.WriteLine("{0} Wang", this.GetType().Name);
        }
    }

其他的动物类都实现了IObject接口,就不在此赘述。

2、声明List集合

public List observerlist = new List();

3、声明MiaoObsever方法

        public void MiaoObsever()
        {
            //Console.WriteLine("{0} MiaoObsever", this.GetType().Name);
            if (observerlist.Count > 0)
            {
                //observerlist.ForEach(item => item.DoAction());

                foreach (var item in observerlist)
                {
                    item.DoAction();
                }
            }
        }

4、将动物类添加至observerlist集合

                    Console.WriteLine("************************this is  Obeserver****************************");
                    {
                        cat.observerlist.Add(new Dog()); //狗叫了
                        cat.observerlist.Add(new Mouse());//老鼠跑了
                        cat.observerlist.Add(new Baby()); // 小孩哭了
                        cat.observerlist.Add(new Mother());
                        cat.observerlist.Add(new Father());
                        cat.observerlist.Add(new Neighbor());
                        cat.observerlist.Add(new Stealer());
                    }

5、执行MiaoObsever方法,执行每个动物类的动作

                    Console.WriteLine("************************this is  Obeserver****************************");
                    {
                        cat.observerlist.Add(new Dog()); //狗叫了
                        cat.observerlist.Add(new Mouse());//老鼠跑了
                        cat.observerlist.Add(new Baby()); // 小孩哭了
                        cat.observerlist.Add(new Mother());
                        cat.observerlist.Add(new Father());
                        cat.observerlist.Add(new Neighbor());
                        cat.observerlist.Add(new Stealer());

                        //执行每个类的动作
                        cat.MiaoObsever();
                    }

8、两种多播委托实现方式的区别

相关