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#中的委托来实习观察者
  • 相关阅读:
    ImportError: libXext.so.6: cannot open shared object file: No such file or directory
    Django项目添加日志
    Django项目DEBUG=False时配置静态文件
    Django项目DEBUG=False时配置静态文件
    真的佩服python强大表达力
    mycharm环境建立django项目并增删改查
    Apache配置https
    安卓签名
    Android studion不能启动问题
    带你入门函数式编程
  • 原文地址:https://www.cnblogs.com/vichin/p/11763924.html
Copyright © 2011-2022 走看看