观察者模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

观察者模式:由于一种行为的发生,而引起或牵扯多种未知行为的发生,为了解除各行为对象之间的耦合,所以产生的一种模式。如:天天应用的事件就是一种观察者模式


比如我们的场景:老板回来了(一种行为) 前台妍妍赶紧关闭了电视剧,财务小妍也赶紧关闭了购物网站,运营小明停止了王者农药,开发小张也睡醒了。(多种行为)


我们现在用普通方式来实现:

 /// <summary>
    /// 前台
    /// </summary>
    public class Reception
    {
        public void LookTvSeries()
        {
            Console.WriteLine(" 妍妍开始看电视剧");
        }
        public void CloseLookTvSeries()
        {
            Console.WriteLine(" 妍妍关闭了电视剧");
        }
    }
 /// <summary>
    /// 财务
    /// </summary>
    public class Finance
    {
        public void ShopTaoBao()
        {
            Console.WriteLine(" 小妍开始逛淘宝");
        }
        public void CloseShopTaoBao()
        {
            Console.WriteLine(" 小妍停止了逛淘宝");
        }
    }
    
       /// <summary>
    /// 运营
    /// </summary>
    public class Operate
    {
        public void PlayGame()
        {
            Console.WriteLine(" 小明开始玩王者农药");
        }

        public void StopPlayGame()
        {
            Console.WriteLine(" 小明停止玩王者农药");
        }
    }
        /// <summary>
    /// 开发
    /// </summary>
    public class Develop
    {
        public void Sleep()
        {
            Console.WriteLine(" 小张睡着了");
        }

        public void StopSleep()
        {
            Console.WriteLine(" 小张睡醒了");
        }
    }
     public class Boss
    {
        public void Coming()
        {
            Console.WriteLine(" 老板回来了!!!");

            new Reception().CloseLookTvSeries();
            new Finance().CloseShopTaoBao();
            new Operate().StopPlayGame();
            new Develop().StopSleep();
        }
    }
    
      class Program
    {
        static void Main(string[] args)
        {
            new Boss().Coming();
            Console.Read();
        }
    }

输出结果:

技术分享


Boss类拥有了其他4个类,程序耦合 不利于维护,还有可能妍妍没看电视剧,小张没睡觉。那么程序应该抽象。用观察者模式来实现


增加IObserver

    public interface IObserver
    {
        void Action();
    }
    
    /// <summary>
    /// 前台
    /// </summary>
    public class Reception: IObserver
    {
        public void LookTvSeries()
        {
            Console.WriteLine(" 妍妍开始看电视剧");
        }

        public void CloseLookTvSeries()
        {
            Console.WriteLine(" 妍妍关闭了电视剧");
        }

        public void Action()
        {
            CloseLookTvSeries();
        }
    }
    /// <summary>
    /// 财务
    /// </summary>
    public class Finance: IObserver
    {
        public void ShopTaoBao()
        {
            Console.WriteLine(" 小妍开始逛淘宝");
        }

        public void CloseShopTaoBao()
        {
            Console.WriteLine(" 小妍停止了逛淘宝");
        }

        public void Action()
        {
            CloseShopTaoBao();
        }
    }
    /// <summary>
    /// 运营
    /// </summary>
    public class Operate:IObserver
    {
        public void PlayGame()
        {
            Console.WriteLine(" 小明开始玩王者农药");
        }

        public void StopPlayGame()
        {
            Console.WriteLine(" 小明停止玩王者农药");
        }

        public void Action()
        {
            StopPlayGame();
        }
    }
        /// <summary>
    /// 开发
    /// </summary>
    public class Develop:IObserver
    {
        public void Sleep()
        {
            Console.WriteLine(" 小张睡着了");
        }

        public void StopSleep()
        {
            Console.WriteLine(" 小张睡醒了");
        }

        public void Action()
        {
            StopSleep();
        }
    }
     public class Boss
    {
        private readonly List<IObserver> _observers = new List<IObserver>();
        public void Coming()
        {
            Console.WriteLine(" 老板回来了!!!");

            foreach (var observer in _observers)
            {
                observer.Action();
            }
            //new Reception().CloseLookTvSeries();
            //new Finance().CloseShopTaoBao();
            //new Operate().StopPlayGame();
            //new Develop().StopSleep();
        }


        public void AddObervers(IObserver observer)
        {
            _observers.Add(observer);
        }
    }
     class Program
    {
        static void Main(string[] args)
        {
            Boss boss = new Boss();

            Reception reception = new Reception();
            reception.LookTvSeries();
            boss.AddObervers(reception);

            Finance finance = new Finance();
            finance.ShopTaoBao();
            boss.AddObervers(finance);

            Operate operate = new Operate();
            operate.PlayGame();
            boss.AddObervers(operate);

            Develop develop = new Develop();
            develop.Sleep();
            boss.AddObervers(develop);

            boss.Coming();
            Console.Read();
        }
    }

输出结果:技术分享


当小明没玩游戏,就不需要加入到observers

这个示例只是为了展示观察者模式,实际使用中可以用event更方便的解决

本文出自 “myself” 博客,请务必保留此出处http://ccandzy.blog.51cto.com/13163569/1979297

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式