码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式(十一)

时间:2017-11-06 22:50:16      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:设计   模式   

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


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


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

 /// <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

观察者模式(十一)

标签:设计   模式   

原文地址:http://ccandzy.blog.51cto.com/13163569/1979297

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!