zoukankan      html  css  js  c++  java
  • 观察者模式

    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 运行截图

     

     

     

    作者:BestNow
    出处:http://www.cnblogs.com/BestNow/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Quartz2D复习(三) --- 涂鸦
    Quartz2D复习(二) --- 手势解锁
    Quartz2D复习(一)--- 基础知识 / 绘制线段圆弧 / 图片水印 / 截图
    控制器和应用数据存储
    UIApplication
    setTimeout和setInterval
    工作中碰到的js问题(disabled表单元素不能提交到服务器)
    通知
    UITableViewController和延时执行、自定义控件
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/tianxue/p/3822648.html
Copyright © 2011-2022 走看看