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

      观察者模式又叫发布-订阅(Publish/Subscribe)模式。

       观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,

    会通知所有观察者对象,使它们能够自动更新自己。

      Subject类,可翻译为主题或抽象通知者,一般一个抽象类或者一个接口实现。它把所有对观察者对象的引用保存再一个聚集(集合)里,

    每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

      /// <summary>
        /// 抽象通知者(主题)
        /// </summary>
        abstract class Subject
        {
            private IList<Observer> observers = new List<Observer>();
    
            /// <summary>
            /// 增加观察者
            /// </summary>
            /// <param name="observer"></param>
            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 o in observers)
                {
                    o.Update();
                }
            }
        }
    View Code

     Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。

    抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个Update()方法,这个方法叫做更新方法。

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

      ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态发生改变时,

    给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。

      /// <summary>
        /// 具体通知者(具体主题)
        /// </summary>
        class ConcreteSubject : Subject
        {
            private string subjectState;
            /// <summary>
            /// 具体被观察者状态
            /// </summary>
            public string SubjectState
            {
                get { return subjectState; }
                set { subjectState = value; }
            }
            
        }
    View Code

      ConcreteObserver类,具体观察者,实现抽象观察者角色要求的更新接口,以便使本身的状态和主题的状态相协调。

    具体观察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。

      /// <summary>
        /// 具体观察者
        /// </summary>
        class ConcreteObserver : Observer
        {
            private string name;
            private string observerState;
            private ConcreteSubject subject;
    
            public ConcreteSubject Subject
            {
                get { return subject; }
                set { subject = value; }
            }
            
    
            public ConcreteObserver(ConcreteSubject subject,string name)
            {
                this.subject = subject;
                this.name = name;
            }
    
            public override void Update()
            {
                this.observerState = this.subject.SubjectState;
                Console.WriteLine("观察者{0}的新状态是{1}",this.name,this.observerState);
            }
        }

    客户端代码:

     static void Main(string[] args)
            {
                ConcreteSubject subject = new ConcreteSubject();
                subject.Attach(new ConcreteObserver(subject, "X"));
                subject.Attach(new ConcreteObserver(subject, "Y"));
                subject.Attach(new ConcreteObserver(subject, "Z"));
    
                subject.SubjectState = "ABC";
                subject.Notify();
    
                Console.ReadKey();
            }

    运行效果如下图:

  • 相关阅读:
    采用springboot+flowable快速实现工作流
    07 Sublime Text3常用快捷键
    06 解决Sublime Text3输入法不跟随的问题
    04 Storage and Calculation C语言中的存储和计算
    05 sublime环境配置及编译运行后输出中文乱码的解决
    04 sublime text 3在线安装package control插件,之后安装主题插件和ConvertToUTF8 插件
    03 sublime text3下配置Java的编译运行环境
    02 sublime text3下配置Python的编译运行环境
    01 sublime text3下配置c/c++ 的编译运行环境
    03 Comments in C Programming C编程中的注释
  • 原文地址:https://www.cnblogs.com/527289276qq/p/5350661.html
Copyright © 2011-2022 走看看