zoukankan      html  css  js  c++  java
  • 观察者模式

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

         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#中的委托来实习观察者
  • 相关阅读:
    Android RSS阅读器
    X86汇编语言学习教程之1 ————前言
    beanstalk源码剖析——概述
    从软件质量看如何写代码(1)
    软件开发模型
    软件质量思考
    数据结构概述
    Don't Distract New Programmers with OOP(转)
    Linus Torvalds’s Lessons on Software Development Management(转)
    谈测试驱动开发
  • 原文地址:https://www.cnblogs.com/vichin/p/11763924.html
Copyright © 2011-2022 走看看