天天看点

随笔记录之多播委托实现观察者模式

拿猫和老鼠的案例来说,代码如下:

1 定义猫类:

    class Cat

    {

        private string name; private string color;    

        public Cat(string name,string color)

        {

            this.name = name; this.color = color;  

        }

        public Action CatDelegate; //定义委托

        //模拟猫状态发生改变

        public void CatComing()

        {

            Console.WriteLine(color+"的猫"+name+"过来了");

            if (CatDelegate!=null)

            {

                CatDelegate();

            }

        }

        //每当观察者做修改,都在被观察者里有变化,增大了代码的耦合性 摒弃

        public void CatComingTwo(Mouse mouse1,Mouse mouse2)

        {

            mouse1.Run();

            mouse2.Run();

        }

    }

2 定义老鼠类:

    class Mouse

    {

        private string name; private string color;

        public Mouse(string name, string color)

        {

            this.name = name;

            this.color = color;

        }

        public void Run()

        {

            Console.WriteLine(color+"的老鼠"+name+"跑了");

        }

    }

    /// <summary>

    /// 使用多播委托实现观察者模式

    /// </summary>

    class Program

    {

        static void Main(string[] args)

        {

            Cat cat = new Cat("Tom","蓝");

            Mouse mouse1 = new Mouse("Jerry", "黄");

            Mouse mouse2 = new Mouse("Petty", "黑");

            //多播委托

            cat.CatDelegate += mouse1.Run;//注册

            cat.CatDelegate += mouse2.Run;

            cat.CatComing();

            Console.ReadKey();

           //非委托方式实现,

            cat.CatComingTwo(mouse1, mouse2);

        }

    }

由此可以看出,在不使用委托方式时,当我们增加了一个老鼠,需要在被观察者的代码里增加参数,修改被观察者的代码;而使用多播委托实现观察者模式,被观察者代码无需改变,当观察者做改变,只需要在委托里注册一下即可