观察者模式(Observer)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

namespace ObserverPattern
{
    //观察者模式 2017。09.16 09:36 added  by longdb

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

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

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

    /// <summary>
    /// 具体主题或者具体通知者。
    /// 将有关状态存入具体观察者对象;
    /// 在具体的主题的内部状态改变时,给所有登记过的观察者发出通知。
    /// </summary>
    class ConcreatSubject : Subject
    {
        private string subjectstate;

        /// <summary>
        /// 具体被观察者的对象。
        /// </summary>
        public string SubjectState
        {
            get { return subjectstate; }
            set { subjectstate = value; }
        }
    }

    /// <summary>
    /// 抽象观察者类。
    /// </summary>
    abstract class Observer
    {
        public abstract void Update(); 
    }

    /// <summary>
    /// 具体观察者,实现抽象观察者角色所有要求的更新接口,
    /// 以便使本身的状态和主题的状态相协调。
    /// </summary>
    class ConcreatObserver : Observer
    {
        private string name;
        private string observerState;
        private ConcreatSubject subject;

        public ConcreatObserver(ConcreatSubject subject,string name)
        {
            //构造器注入。
            this.subject = subject;
            this.name = name;
        }
        public override void Update()
        {
            observerState = subject.SubjectState;
            Console.WriteLine("观察者{0}的新状态是{1}",name,observerState);
        }

        public ConcreatSubject Subject
        {
            get { return subject; }
            set { subject = value; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ConcreatSubject sub = new ConcreatSubject();
            sub.Attach(new ConcreatObserver(sub, "张三"));
            sub.Attach(new ConcreatObserver(sub, "李四"));
            sub.Attach(new ConcreatObserver(sub, "王五"));

            sub.SubjectState = "abc";
            sub.Notify();

            Console.ReadKey();
        }
    }
}

 

posted @ 2017-09-16 10:15  longdb  阅读(314)  评论(0编辑  收藏  举报