观察者模式 -- 大话设计模式

在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……

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

1.观察者模式应用

  定义抽象通知者(主题)和抽象观察者,抽象通知者负责增加、移除和通知抽象观察者,抽象观察者得到通知的时候更新自己

    /// <summary>
    /// 主题或者抽象通知者
    /// </summary>
    public abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();

        /// <summary>
        /// 增加观察者
        /// </summary>
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        /// <summary>
        /// 移除观察者
        /// </summary>
        /// <param name="observer"></param>
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }

        /// <summary>
        /// 通知观察者
        /// </summary>
        public void Notify()
        {
            foreach (var v in observers)
            {
                v.Update();
            }
        }
    }

    /// <summary>
    /// 抽象观察者(为所有具体观察者定义的一个接口,在得到主题通知时更新自己)
    /// </summary>
    public abstract class Observer
    {
        public abstract void Update();
    }

   定义具体通知者(主题)和具体观察者,具体观察者实现具体业务

    /// <summary>
    /// 具体主题或者通知者
    /// </summary>
    public class ConcreteSubject : Subject
    {
        public string SubjectState { get; set; }
    }

    /// <summary>
    /// 具体观察者
    /// </summary>
    public class ConcreteObserver : Observer
    {
        private string _name;

        public ConcreteSubject Subject { get; set; }

        public ConcreteObserver(ConcreteSubject subject, string name)
        {
            this._name = name;
            this.Subject = subject;
        }

        public override void Update()
        {
            Console.WriteLine("观察者{0}:通知者发来最新消息【{1}】", this._name, this.Subject.SubjectState);
        }
    }

   开启场景模拟

        static void Main(string[] args)
        {
            ConcreteSubject s = new ConcreteSubject();

            s.Attach(new ConcreteObserver(s, "X"));
            s.Attach(new ConcreteObserver(s, "Y"));
            s.Attach(new ConcreteObserver(s, "Z"));

            s.SubjectState = "ABC";
            s.Notify();
        }

 

posted @ 2015-10-31 08:31  荒古禁地  阅读(158)  评论(0编辑  收藏  举报