首页 > 代码库 > 观察者模式

观察者模式

1 类图  

观察者模式(Observer Pattern)也叫做发布订阅模式(Public/Subscribe)。

  

2 代码

 

Subject 被观察者

  定义被观察者必须实现的职责,它必须能够动态的增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。

 

  

    /// <summary>    /// 被观察者    /// </summary>   public abstract class Subject    {        /// <summary>        /// 观察者列表        /// </summary>       private List<Observer> lstObserver = new List<Observer>();       /// <summary>       /// 添加观察者       /// </summary>       /// <param name="observer">观察者</param>       public void AddObserver(Observer observer)       {           this.lstObserver.Add(observer);       }       /// <summary>       /// 删除观察者       /// </summary>       /// <param name="observer">观察者</param>       public void DelObserver(Observer observer)       {           this.lstObserver.Remove(observer);       }       /// <summary>       /// 通知所有观察者       /// </summary>       public void NotifyObservers()       {           foreach (Observer item in this.lstObserver)           {               item.Update();           }       }    }

 

ConcreteSubject具体的被观察者

  定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

    /// <summary>    /// 具体被观察者    /// </summary>    public class ConcreteSubject : Subject    {        /// <summary>        /// 具体业务        /// </summary>        public void DoSomething()        {            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": ConcreteSubject处理完毕,通知观察者!");            this.NotifyObservers();        }    }

Observer观察者

  观察者收到消息后,即进行update(更新方法)操作,对收到的消息进行处理。

    /// <summary>    /// 观察者    /// </summary>    public interface Observer    {        /// <summary>        /// 更新方法        /// </summary>        void Update();    }

ConcreteObserver具体的观察者

  每个观察者在收到消息后的处理反应是不同的,各个观察者都有自己的处理逻辑。

    /// <summary>    /// 具体观察者    /// </summary>    public class ConcreteObserver : Observer    {        /// <summary>        /// 更新方法        /// </summary>        public void Update()        {            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": ConcreteObserver收到消息,开始处理!");        }    }

场景类

    /// <summary>    /// 入口    /// </summary>    class Program    {        /// <summary>        /// 入口        /// </summary>        /// <param name="args">参数</param>        static void Main(string[] args)        {            // 具体被观察者            ConcreteSubject subject = new ConcreteSubject();            // 观察者            Observer obs = new ConcreteObserver();            // 被观察者添加观察者            subject.AddObserver(obs);            // 被观察者开始处理业务            subject.DoSomething();            Console.ReadLine();        }    }

3 运行截图