进击的订阅模式

1.需求

  草原上有 A、B 两只动物,有一只饥肠辘辘的狮子来到了草原上。

  如果狮子发现了 A,那 A 就要赶紧跑,B 可以继续猫着;如果狮子发现了 B,那 B 就要跑路,A 可以猫着;

  如果狮子把 A、B 都看到了,那 A、B 都得跑,谁知道狮子中意追哪个呢;如果狮子谁都没看见,那 A、B 都猫着。

 

2.实践

  如果用传统if、else的话,业务加个C动物,那么狮子就要重新考虑,效率低、拓展性低。改用 委托+事件 完成对 狮子的订阅事件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 发布_订阅者模式
{
    class Program
    {
       static void Main(string[] args)
       {
          狮子 狮子 = new 狮子();
          A a = new A(狮子);
          B b = new B(狮子);

          狮子.Find("A");

          狮子.Find("B");

          狮子.Find("AB");

          Console.ReadLine();

        // 由于A和B订阅了狮子的事件,所以无需任何代码,A和B均会按照约定进行动作。
      }
    }

    public delegate void FindEventHandler(string animals);

    public class 狮子
    {
         public event FindEventHandler FindEvent;

         public void Find(string animals)
         {
             Console.WriteLine("狮子发现了{0}", animals);
             if (FindEvent != null)
             {
                 FindEvent(animals);
             }
         }
    }

    public class A
    {
        public A(狮子 狮子)
        {
            狮子.FindEvent += new FindEventHandler(a_FindEvent);//订阅发现事件
        }

        void a_FindEvent(string animals)
        {
            if(animals.Contains("A"))
            {
                Run();
            }
        }

        public void Run()
        {
             Console.WriteLine("我是 A,被狮子发现了,我要跑了");
        }
    }

    public class B
    {
         public B(狮子 狮子)
         {
              狮子.FindEvent += new FindEventHandler(b_FindEvent);//订阅发现事件
         }

         void b_FindEvent(string animals)
         {
              if (animals.Contains("B"))
              {
                  Run();
              }
         }

         public void Run()
         {
              Console.WriteLine("我是 B,被狮子发现了,我要跑了");
         }
    }
}

 

posted @ 2019-08-13 10:09  超级驼鹿  阅读(243)  评论(0编辑  收藏  举报
/*