• 设计模式学习笔记——观察者模式(Observer)


    1.特点:一对多依赖关系,一端变化、多端得到通知并自动更新。(目标与观察者可实现弱耦合)

    2.概念:有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    3.类图:

    4.代码实现

    /// <summary>
        /// 抽象主题类
        /// </summary>
        public 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 (Observer o in observers)
                {
                    o.Update();
                }
            }
        }
    
        /// <summary>
        /// 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己
        /// </summary>
        public abstract class Observer
        {
            public abstract void Update();
        }
    
        /// <summary>
        /// 具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
        /// </summary>
        public class ConcreteSubject : Subject
        {
            private string subjectState;
    
            /// <summary>
            /// 具体观察者的状态
            /// </summary>
            public string SubjectState
            {
                get { return subjectState; }
                set { subjectState = value; }
            }
        }
    
        /// <summary>
        /// 具体观察者,实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调
        /// </summary>
        public class ConcreteObserver : Observer
        {
            private string observerState;
            private string name;
            private ConcreteSubject subject;
    
            /// <summary>
            /// 具体观察者用一个具体主题来实现
            /// </summary>
            public ConcreteSubject Subject
            {
                get { return subject; }
                set { subject = value; }
            }
    
            public ConcreteObserver(ConcreteSubject subject, string name)
            {
                this.subject = subject;
                this.name = name;
            }
    
            /// <summary>
            /// 实现抽象观察者中的更新操作
            /// </summary>
            public override void Update()
            {
                observerState = subject.SubjectState;
                Console.WriteLine("The observer's state of {0} is {1}", name, observerState);
            }
        }
    
    class Program
        {
            static void Main(string[] args)
            {
                // 具体主题角色通常用具体自来来实现
                ConcreteSubject subject = new ConcreteSubject();
    
                subject.Attach(new ConcreteObserver(subject, "Observer A"));
                subject.Attach(new ConcreteObserver(subject, "Observer B"));
                subject.Attach(new ConcreteObserver(subject, "Observer C"));
    
                subject.SubjectState = "Ready";
                subject.Notify();
    
                Console.Read();
            }
        }
    

      

  • 相关阅读:
    JavaScript得到当前窗口的所有大小值
    JavaScript 变量、作用域和内存问题
    jQuery html5Validate基于HTML5表单验证插件
    新世界
    2001年的火花
    High Dynamic Range Compression on Programmable Graphics Hardware
    运筹帷幄
    你还要在学校找什么东西?
    图行天下
    Supra Team
  • 原文地址:https://www.cnblogs.com/ice-baili/p/4710410.html
Copyright © 2020-2023  润新知