观察者模式

观察者模式:解决一个对象的某个事件在发生后,触发一系列其他对象的动作。并且不希望对象之间存在紧密的依赖关系。

     static void Main(string[] args)
     {
         Chicken ck = new Chicken();
         ck.Woo();//没使用观察者模式的方法。
     }

    public class Chicken
    {
        public void Woo() {
            Console.WriteLine("先是鸡叫!");
            //Woo方法调用之后,需要执行另外3个类中的3个方法。
            new Father().Razor();
            new Brother().Turn();
            new Baby().Cry();
            //这种方式带有强烈的入侵感,当Father、Brother、Baby中任意一个类发生变化,那么Woo方法就要发生变化。
        }
    }
在不使用观察者模式的情况下
interface IObserver
    {
        void Action();
    }

    public class Father : IObserver
    {
        public void Action()
        {
            this.Razor();
        }
        public void Razor()
        {
            Console.WriteLine("{0} Razor", this.GetType().Name);
        }
    }

    public class Brother : IObserver
    {
        public void Action()
        {
            this.Turn();
        }
        public void Turn()
        {
            Console.WriteLine("{0} Turn", this.GetType().Name);
        }
    }

   public class Baby:IObserver
    {
       public void Action() {
           this.Cry();
       }
       public void Cry()
       {
           Console.WriteLine("{0} Cry",this.GetType().Name);
       }
    }

    public class Chicken
    {
        //使用观察者模式
        //1、IObserver接口,然后让Father、Brother、Baby继承接口,并在类中实现IObserver接口中的Action方法,让Action方法去调用Razor,Trun和Cry方法
        //2、在Chicken中声明一个对象队列(列表),再循环这个列表去执行。
        private List<IObserver> _ObserverList = new List<IObserver>();
        public void AddObserver(IObserver observer)
        {
            this._ObserverList.Add(observer);
        }
        public void WooObserver()
        {
            Console.WriteLine("先是鸡叫!", this.GetType().Name);
            if (this._ObserverList.Count > 0)
            {
                foreach (var item in _ObserverList)
                {
                    item.Action();
                }
            }
        }
    }

        static void Main(string[] args)
        {
            //使用观察者模式
            Chicken ck1 = new Chicken();
            ck1.AddObserver(new Father());
            ck1.AddObserver(new Brother());
            ck1.AddObserver(new Baby());
            ck1.WooObserver();
        }

使用C#中的委托来实现观察者模式,需要方法的参数列表和返回值相同。

public class Father //: IObserver
    {
        //public void Action()
        //{
        //    this.Razor();
        //}
        public void Razor()
        {
            Console.WriteLine("{0} Razor", this.GetType().Name);
        }
    }

 public class Brother //: IObserver
    {
        //public void Action()
        //{
        //    this.Turn();
        //}
        public void Turn()
        {
            Console.WriteLine("{0} Turn", this.GetType().Name);
        }
    }

 public class Baby//:IObserver
    {
        //public void Action() {
        //    this.Cry();
        //}
        public void Cry()
        {
            Console.WriteLine("{0} Cry", this.GetType().Name);
        }
    }

    public class Chicken
    {
        //在C#中使用event来实现。
        public event Action WooHandler;
        public void WooEvent() {
            Console.WriteLine("先是鸡叫!", this.GetType().Name);
            if (WooHandler != null)
            {
                foreach (Action action in this.WooHandler.GetInvocationList())
                {
                    action.Invoke();
                }
               //也可以使用this.WooHandler.Invoke();来替代for循环
            }
        }
    }

        static void Main(string[] args)
        {
            //使用委托
            Chicken ck2 = new Chicken();
            ck2.WooHandler += new Action(new Father().Razor);
            ck2.WooHandler += new Brother().Turn;
            ck2.WooHandler += new Baby().Cry;
            ck2.WooEvent();
            Console.ReadKey();
        }
使用C#中的委托来实习观察者
原文地址:https://www.cnblogs.com/vichin/p/11763924.html