设计模式学习之观察者模式(Observer,行为型模式)(7)

1.观察者模式又叫做发布-订阅模式。

2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

3.使用观察者模式的好处:维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。
什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。

private static void Main(string[] args)
        {
            Boss boss = new Boss();
            boss.Update += new StockObserver("股票哥", boss).CloseStockMarket;
            boss.Update += new NBAObserver("NBA哥", boss).CloseNBADirectSeeding;
            boss.SubjectState = "老板回来了。。。";
            boss.Notify();
        }


        /// <summary>
        /// 通知者接口
        /// </summary>
        public interface ISubject
        {
            void Notify();

            string SubjectState { get; set; }
        }

        public delegate void EventHandler();

        public class Boss : ISubject
        {
            public event EventHandler Update;

            public void Notify()
            {
                if (Update != null)
                {
                    Update();
                }
            }

            public string SubjectState { get; set; }
        }

        /// <summary>
        /// 前台秘书类
        /// </summary>
        public class Secretary : ISubject
        {
            public event EventHandler Update;

            public void Notify()
            {
                if (Update != null)
                {
                    Update();
                }
            }

            public string SubjectState { get; set; }
        }

        /// <summary>
        /// 看股票的同事
        /// </summary>
        public class StockObserver
        {
            private string name;
            private ISubject subject;

            public StockObserver(string name, ISubject subject)
            {
                this.name = name;
                this.subject = subject;
            }

            public void CloseStockMarket()
            {
                Console.WriteLine("{0} {1}  关闭股票行情,继续工作!", subject.SubjectState, name);
            }
        }

        /// <summary>
        /// 看NBA的同事
        /// </summary>
        public class NBAObserver
        {
            private string name;
            private ISubject subject;

            public NBAObserver(string name, ISubject subject)
            {
                this.name = name;
                this.subject = subject;
            }

            public void CloseNBADirectSeeding()
            {
                Console.WriteLine("{0} {1}  关闭NBA直播,继续工作!", subject.SubjectState, name);
            }
        }
原文地址:https://www.cnblogs.com/yxlblogs/p/3833919.html