首页 > 代码库 > 设计模式学习之观察者模式(Observer,行为型模式)(7)

设计模式学习之观察者模式(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);            }        }